Release 971130

Sat Nov 29 12:35:26 1997  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [if1632/builtin.c]
	Build a complete PE header for builtin Win32 modules.

	* [loader/pe_image.c] [loader/module.c]
	HMODULE32 now points to the loading address of the module. There
	is no longer a separate PE_MODULE structure.

Fri Nov 28 11:21:47 1997  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>

	* [ole/*][configure.in][Makefile.in][include/interfaces.h]
	  [if1632/olesvr32.spec][if1632/olecli32.spec]
	New directory, moved OLE stuff there.
	new .spec files for olecli32,olesvr32, some stubs added.

	* [misc/shell.c]
	Added support for extracting icons from PE dlls.

	* [misc/shellord.c][if1632/shell32.spec]
	Added a huge heap of ordinal only exported shell functions
	(will work only in Win95).

	* [loader/task.c]
	Hack to make MakeProcInstance16 work in all cases (mplayer.exe).

	* [win32/string32.c][include/string32.h]
	Obsolete, removed.

	* [windows/keyboard.c]
	Added *RegisterHotkey.

	* [objects/font.c][objects/text.c]
	Added GetFontLanguageInfo, GetTextCharsetInfo.

Wed Nov 26 18:10:40 1997  Uwe Bonnes  <bon@elektron.ikp.physik.tu-darmstadt.de>

	* [misc/network.c]
	In WNetGetConnection16 return the Drive label and not the DOS-Cwd.
	Makes Wordview 6 start on a network connected machine.

	* [controls/status.c]
	Catch a Null pointer in SW_SetText.

	* [files/dos_fs.c]
 	Add NT5 functions GetLongPathName32.

	* [files/file.c]
	Make GetTempFileName16 accept drive 0 (Current Drive) too.
	Handle more errors and be more verbose in FILE_SetDosError, fix
	an error in DeleteFile32W

	* [memory/virtual.c]
	Implement FlushViewOfFile.

	* [misc/crtdll]
	Implement _rotl and splitpath and add a stub for 
	_abnormal_termination.

	* [misc/printdrv.c]
	Stub for EnumPrinters32A.

	* [win32/newfns]
	Add Stub for QueryPerformanceFrequency, change return value
	for QueryPerformanceCounter.
 	Add stub for DeviceIoControl.

Tue Nov 25 15:55:01 1997 Martin Boehme <boehme@informatik.mu-luebeck.de>

	* [controls/combo.c] [controls/edit.c] [windows/defwnd.c]
	  [windows/winpos.c] [windows/win.c]
	Removed WIN_NO_REDRAW flag.

Tue Nov 25 13:20:35 1997  Douglas Ridgway <ridgway@taiga.v-wave.com>

	* [graphics/x11drv/bitblt.c]
	Fixed memory leak in BITBLT_GetDstArea.

Sun Nov 23 14:05:23 1997  Andreas Mohr <100.30936@germany.net>

	* [files/directory.c]
	Export windows system directory to environment.

	* [if1632/Makefile.in] [if1632/builtin.c] [if1632/w32skrnl.spec]
	  [if1632/win32s16.spec] [misc/w32scomb.c] [misc/w32skrnl.c]
	Added Win32s DLLs W32SKRNL and WIN32S16.

	* [if1632/kernel32.spec] [loader/module.c]
	Added misc functions for Win32s.

	* [if1632/kernel.spec] [loader/task.c]
	Added DefineHandleTable().

	* [scheduler/process.c]
	Fixed SetEnvironmentVariable32A() to avoid heap corruption.

Sat Nov 22 14:11:42 1997  Kristian Nielsen  <kristian.nielsen@risoe.dk>

	* [windows/painting.c]
	Fix leak in BeginPaint16() for CS_PARENTDC windows where the
	update region was not properly released.

Thu Nov 20 03:55:29 1997  Gordon Chaffee <chaffee@CS.Berkeley.EDU>

	* [loader/pe_image.c]
	Implemented forwarded DLL functions.

	* [objects/dib.c]
	Added support for 16- and 32-bit mode DIBs.
	Support negative bitmap heights.

	* [win32/process.c]
	Added stub for CreateProcess32W.

	* [win32/security.c] [include/ntdll.h]
	Added stubs for LookupAccountSid32A/W.

	* [scheduler/process.c]
	Use the size specified in the PE header for the process heap.

Mon Nov 17 00:53:35 1997  Len White <phreak@cgocable.net>

	* [msdos/int3d.c]
	New file. Stubs for int3d.

Sun Nov 16 12:30:00 PST 1997  Jason Schonberg  <schon@mti.sgi.com>

	* [include/aspi.h]
	Changed comment style from C++ to C.
diff --git a/scheduler/process.c b/scheduler/process.c
index 4600e4d..e3bd71b 100644
--- a/scheduler/process.c
+++ b/scheduler/process.c
@@ -16,6 +16,7 @@
 #include "ldt.h"
 #include "thread.h"
 #include "winerror.h"
+#include "pe_image.h"
 
 PDB32 *pCurrentProcess = NULL;
 
@@ -306,7 +307,12 @@
 PDB32 *PROCESS_Create( TDB *pTask, LPCSTR cmd_line )
 {
     PDB32 *pdb = HeapAlloc( SystemHeap, HEAP_ZERO_MEMORY, sizeof(PDB32) );
+    DWORD size, commit;
+    NE_MODULE *pModule;
+
     if (!pdb) return NULL;
+    if (!(pModule = MODULE_GetPtr( pTask->hModule ))) return 0;
+
     pdb->header.type     = K32OBJ_PROCESS;
     pdb->header.refcount = 1;
     pdb->exit_code       = 0x103; /* STILL_ACTIVE */
@@ -318,8 +324,23 @@
     pdb->group           = pdb;
     pdb->priority        = 8;  /* Normal */
     pdb->heap_list       = pdb->heap;
+
     InitializeCriticalSection( &pdb->crit_section );
-    if (!(pdb->heap = HeapCreate( HEAP_GROWABLE, 0x10000, 0 ))) goto error;
+
+    /* Create the heap */
+
+    if (pModule->module32)
+    {
+	size  = PE_HEADER(pModule->module32)->OptionalHeader.SizeOfHeapReserve;
+	commit = PE_HEADER(pModule->module32)->OptionalHeader.SizeOfHeapCommit;
+    }
+    else
+    {
+	size = 0x10000;
+	commit = 0;
+    }
+    if (!(pdb->heap = HeapCreate( HEAP_GROWABLE, size, commit ))) goto error;
+
     if (!(pdb->env_db = HeapAlloc(pdb->heap, HEAP_ZERO_MEMORY, sizeof(ENVDB))))
         goto error;
     if (!(pdb->handle_table = PROCESS_AllocHandleTable( pdb ))) goto error;
@@ -379,6 +400,21 @@
 }
 
 
+/*********************************************************************
+ *	OpenProcess				[KERNEL32.543]
+ *
+ */
+HANDLE32 WINAPI OpenProcess32(DWORD fdwAccess,BOOL32 bInherit,DWORD IDProcess)
+{
+	if (IDProcess != (DWORD)pCurrentProcess) {
+		fprintf(stderr,"OpenProcess32(%ld,%d,%ld)\n",fdwAccess,bInherit,IDProcess);
+		/* XXX: might not be the correct error value */
+		SetLastError( ERROR_INVALID_HANDLE );
+		return 0;
+	}
+	return GetCurrentProcess();
+}			      
+
 /***********************************************************************
  *           GetCurrentProcessId   (KERNEL32.199)
  */
@@ -475,7 +511,13 @@
     }
     if (!*p) goto not_found;
     if (value) lstrcpyn32A( value, p + len + 1, size );
-    return strlen(p);
+    len = strlen(p);
+    /* According to the Win32 docs, if there is not enough room, return
+     * the size required to hold the string plus the terminating null
+     */
+    if (size <= len) len++;
+    return len;
+	
 not_found:
     return 0;  /* FIXME: SetLastError */
 }
@@ -527,13 +569,20 @@
     len = value ? strlen(name) + strlen(value) + 2 : 0;
     if (!res) len -= strlen(p) + 1;  /* The name already exists */
     size = pCurrentProcess->env_db->env_size + len;
+    if (len < 0)
+    {
+        LPSTR next = p + strlen(p) + 1;
+        memmove( next + len, next,
+                 pCurrentProcess->env_db->env_size - (next - env) );
+    }
     if (!(new_env = HeapReAlloc( GetProcessHeap(), 0, env, size )))
         return FALSE;
     p = new_env + (p - env);
+    if (len > 0)
+        memmove( p + len, p, pCurrentProcess->env_db->env_size - (p-new_env) );
 
     /* Set the new string */
 
-    memmove( p + len, p, pCurrentProcess->env_db->env_size - (p-new_env) );
     if (value)
     {
         strcpy( p, name );
@@ -597,8 +646,8 @@
 				LPSTR	x = HeapAlloc(heap,0,end-s+1);
 				char	buf[2];
 
-				lstrcpyn32A(x,s+1,end-s-1);
-				x[end-s-1]=0;
+				lstrcpyn32A(x,s+1,end-s);
+				x[end-s]=0;
 
 				/* put expanded variable directly into 
 				 * destination string, so we don't have
@@ -606,7 +655,7 @@
 				 */
 				ret = GetEnvironmentVariable32A(x,buf,2);
 				CHECK_FREE(ret+2);
-				ret = GetEnvironmentVariable32A(x,d,d-xdst);
+				ret = GetEnvironmentVariable32A(x,d,cursize-(d-xdst));
 				if (ret) {
 					d+=strlen(d);
 				} else {
@@ -826,6 +875,21 @@
 }
 
 /***********************************************************************
+ *           GetProcessFlags    (KERNEL32)
+ */
+DWORD WINAPI GetProcessFlags(DWORD processid)
+{
+	PDB32	*process;
+
+	if (!processid) {
+		process=pCurrentProcess;
+		/* check if valid process */
+	} else
+		process=(PDB32*)pCurrentProcess; /* decrypt too, if needed */
+	return process->flags;
+}
+
+/***********************************************************************
  *           SetProcessWorkingSetSize    (KERNEL32)
  */
 BOOL32 WINAPI SetProcessWorkingSetSize(HANDLE32 hProcess,DWORD minset,