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,