From 0ffa768455723786d6637fbb93bec4e003eaee55 Mon Sep 17 00:00:00 2001 From: Robert Dickenson Date: Tue, 7 Jan 2003 17:29:09 +0000 Subject: [PATCH] Added support for lauching VDM on dos image load. Depends phase in makefile for processing with wmc. Included message table resources section. Added some some missing exports for wine module linkage. svn path=/trunk/; revision=3948 --- reactos/lib/kernel32/kernel32.def | 2 + reactos/lib/kernel32/kernel32.edf | 5 +- reactos/lib/kernel32/kernel32.rc | 3 + reactos/lib/kernel32/makefile | 8 +- reactos/lib/kernel32/misc/errormsg.c | 20 ++--- reactos/lib/kernel32/misc/stubs.c | 27 +++++- reactos/lib/kernel32/process/create.c | 113 ++++++++++++++++++++++++-- 7 files changed, 158 insertions(+), 20 deletions(-) diff --git a/reactos/lib/kernel32/kernel32.def b/reactos/lib/kernel32/kernel32.def index fb5fb89fba1..c1499dd2c23 100644 --- a/reactos/lib/kernel32/kernel32.def +++ b/reactos/lib/kernel32/kernel32.def @@ -263,6 +263,8 @@ GetExitCodeThread@8 GetFiberData@0 GetFileAttributesA@4 GetFileAttributesW@4 +GetFileAttributesExA +GetFileAttributesExW GetFileInformationByHandle@8 GetFileSize@8 GetFileTime@16 diff --git a/reactos/lib/kernel32/kernel32.edf b/reactos/lib/kernel32/kernel32.edf index 956a54b98b5..faa3619ff2d 100644 --- a/reactos/lib/kernel32/kernel32.edf +++ b/reactos/lib/kernel32/kernel32.edf @@ -1,4 +1,4 @@ -; $Id: kernel32.edf,v 1.19 2003/01/05 14:32:32 robd Exp $ +; $Id: kernel32.edf,v 1.20 2003/01/07 17:29:09 robd Exp $ ; ; kernel32.edf ; @@ -54,6 +54,7 @@ BuildCommDCBAndTimeoutsW=BuildCommDCBAndTimeoutsW@12 BuildCommDCBW=BuildCommDCBW@8 CallNamedPipeA=CallNamedPipeA@28 CallNamedPipeW=CallNamedPipeW@28 +CancelIo=CancelIo@4 CancelWaitableTimer=CancelWaitableTimer@4 ClearCommBreak=ClearCommBreak@4 ClearCommError=ClearCommError@12 @@ -267,6 +268,8 @@ GetExitCodeThread=GetExitCodeThread@8 GetFiberData=GetFiberData@0 GetFileAttributesA=GetFileAttributesA@4 GetFileAttributesW=GetFileAttributesW@4 +GetFileAttributesExA=GetFileAttributesExA@12 +GetFileAttributesExW=GetFileAttributesExW@12 GetFileInformationByHandle=GetFileInformationByHandle@8 GetFileSize=GetFileSize@8 GetFileTime=GetFileTime@16 diff --git a/reactos/lib/kernel32/kernel32.rc b/reactos/lib/kernel32/kernel32.rc index 78588bb0034..bdc2e3faaab 100644 --- a/reactos/lib/kernel32/kernel32.rc +++ b/reactos/lib/kernel32/kernel32.rc @@ -1,6 +1,7 @@ #include #include + LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US VS_VERSION_INFO VERSIONINFO @@ -36,3 +37,5 @@ BEGIN END END + +#include "errcodes.rc" diff --git a/reactos/lib/kernel32/makefile b/reactos/lib/kernel32/makefile index e7ebb837e29..1c120d958a7 100644 --- a/reactos/lib/kernel32/makefile +++ b/reactos/lib/kernel32/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.56 2003/01/05 10:07:07 robd Exp $ +# $Id: makefile,v 1.57 2003/01/07 17:29:09 robd Exp $ PATH_TO_TOP = ../.. @@ -26,6 +26,10 @@ include $(PATH_TO_TOP)/rules.mak include $(TOOLS_PATH)/helper.mk +depends: + make -f errormsg.mak + +.PHONY: depends SYNCH_OBJECTS = synch/critical.o synch/event.o synch/intrlck.o synch/mutex.o \ synch/sem.o synch/timer.o synch/wait.o @@ -107,7 +111,7 @@ OBJECTS = $(MISC_OBJECTS) $(FILE_OBJECTS) $(THREAD_OBJECTS) \ #$(NLS_OBJECTS) -$(TARGET_NAME).o: $(OBJECTS) +$(TARGET_NAME).o: $(OBJECTS) errcodes.rc $(LD) -r $(OBJECTS) -o $(TARGET_NAME).o %/TAGS: diff --git a/reactos/lib/kernel32/misc/errormsg.c b/reactos/lib/kernel32/misc/errormsg.c index 0bb0590c8e2..7a1ac55500f 100644 --- a/reactos/lib/kernel32/misc/errormsg.c +++ b/reactos/lib/kernel32/misc/errormsg.c @@ -1,4 +1,4 @@ -/* $Id: errormsg.c,v 1.2 2002/12/08 16:07:17 robd Exp $ +/* $Id: errormsg.c,v 1.3 2003/01/07 17:29:08 robd Exp $ * * reactos/lib/kernel32/misc/errormsg.c * @@ -140,7 +140,7 @@ static INT load_messageA( HMODULE instance, UINT id, WORD lang, PMESSAGE_RESOURCE_ENTRY mre; int i,slen; - TRACE("instance = %08lx, id = %08lx, buffer = %p, length = %ld\n", (DWORD)instance, (DWORD)id, buffer, (DWORD)buflen); + //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); @@ -167,7 +167,7 @@ static INT load_messageA( HMODULE instance, UINT id, WORD lang, mre = (PMESSAGE_RESOURCE_ENTRY)(((char*)mre)+mre->Length); } slen=mre->Length; - TRACE(" - strlen=%d\n",slen); + //TRACE(" - strlen=%d\n",slen); i = min(buflen - 1, slen); if (buffer == NULL) return slen; @@ -183,8 +183,10 @@ static INT load_messageA( HMODULE instance, UINT id, WORD lang, return 0; } } - if (buffer) - TRACE("'%s' copied !\n", buffer); + if (buffer) { + //TRACE("'%s' copied !\n", buffer); + TRACE("'%s'\n", buffer); + } return i; } @@ -238,8 +240,7 @@ DWORD WINAPI FormatMessageA( HMODULE hmodule = (HMODULE)lpSource; CHAR ch; - TRACE("(0x%lx,%p,%ld,0x%lx,%p,%ld,%p)\n", - dwFlags,lpSource,dwMessageId,dwLanguageId,lpBuffer,nSize,args); + //TRACE("(0x%lx,%p,%ld,0x%lx,%p,%ld,%p)\n", dwFlags,lpSource,dwMessageId,dwLanguageId,lpBuffer,nSize,args); if ((dwFlags & FORMAT_MESSAGE_FROM_STRING) &&((dwFlags & FORMAT_MESSAGE_FROM_SYSTEM) || (dwFlags & FORMAT_MESSAGE_FROM_HMODULE))) return 0; @@ -454,7 +455,7 @@ DWORD WINAPI FormatMessageA( } HeapFree(GetProcessHeap(),0,target); if (from) HeapFree(GetProcessHeap(),0,from); - TRACE("-- returning %d\n", (dwFlags & FORMAT_MESSAGE_ALLOCATE_BUFFER) ? strlen(*(LPSTR*)lpBuffer):strlen(lpBuffer)); + //TRACE("-- returning %d\n", (dwFlags & FORMAT_MESSAGE_ALLOCATE_BUFFER) ? strlen(*(LPSTR*)lpBuffer):strlen(lpBuffer)); return (dwFlags & FORMAT_MESSAGE_ALLOCATE_BUFFER) ? strlen(*(LPSTR*)lpBuffer): strlen(lpBuffer); @@ -489,8 +490,7 @@ DWORD WINAPI FormatMessageW( HMODULE hmodule = (HMODULE)lpSource; CHAR ch; - TRACE("(0x%lx,%p,%ld,0x%lx,%p,%ld,%p)\n", - dwFlags,lpSource,dwMessageId,dwLanguageId,lpBuffer,nSize,args); + //TRACE("(0x%lx,%p,%ld,0x%lx,%p,%ld,%p)\n", dwFlags,lpSource,dwMessageId,dwLanguageId,lpBuffer,nSize,args); if ((dwFlags & FORMAT_MESSAGE_FROM_STRING) &&((dwFlags & FORMAT_MESSAGE_FROM_SYSTEM) || (dwFlags & FORMAT_MESSAGE_FROM_HMODULE))) return 0; diff --git a/reactos/lib/kernel32/misc/stubs.c b/reactos/lib/kernel32/misc/stubs.c index 82bf81d09d2..e1615e28360 100644 --- a/reactos/lib/kernel32/misc/stubs.c +++ b/reactos/lib/kernel32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.40 2003/01/05 10:07:08 robd Exp $ +/* $Id: stubs.c,v 1.41 2003/01/07 17:29:09 robd Exp $ * * KERNEL32.DLL stubs (unimplemented functions) * Remove from this file, if you implement them. @@ -1023,4 +1023,29 @@ VirtualBufferExceptionHandler ( return 0; } +BOOL +STDCALL +GetFileAttributesExA( + LPCSTR lpFileName, + GET_FILEEX_INFO_LEVELS fInfoLevelId, + LPVOID lpFileInformation + ) +{ + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return 0; +} + +BOOL +STDCALL +GetFileAttributesExW( + LPCWSTR lpFileName, + GET_FILEEX_INFO_LEVELS fInfoLevelId, + LPVOID lpFileInformation + ) +{ + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return 0; +} + + /* EOF */ diff --git a/reactos/lib/kernel32/process/create.c b/reactos/lib/kernel32/process/create.c index fd00037ecdf..5a4a88b4959 100644 --- a/reactos/lib/kernel32/process/create.c +++ b/reactos/lib/kernel32/process/create.c @@ -1,4 +1,4 @@ -/* $Id: create.c,v 1.57 2002/11/05 20:54:10 hbirr Exp $ +/* $Id: create.c,v 1.58 2003/01/07 17:29:08 robd Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -25,7 +25,7 @@ #include #include -#define NDEBUG +#define DBG #include #include @@ -167,6 +167,8 @@ CreateProcessA (LPCSTR lpApplicationName, return Result; } +static int _except_recursion_trap = 0; + struct _CONTEXT; struct __EXCEPTION_RECORD; @@ -181,15 +183,25 @@ _except_handler( { DPRINT("Process terminated abnormally...\n"); + if (++_except_recursion_trap > 3) { + DPRINT("_except_handler(...) appears to be recursing.\n"); + DPRINT("Process HALTED.\n"); + for (;;) {} + } + if (/* FIXME: */ TRUE) /* Not a service */ { - ExitProcess(0); + DPRINT(" calling ExitProcess(0) no, lets try ExitThread . . .\n"); + //ExitProcess(0); + ExitThread(0); } else { + DPRINT(" calling ExitThread(0) . . .\n"); ExitThread(0); } + DPRINT(" We should not get to here !!!\n"); /* We should not get to here */ return ExceptionContinueSearch; } @@ -200,6 +212,8 @@ BaseProcessStart(LPTHREAD_START_ROUTINE lpStartAddress, { UINT uExitCode = 0; + DPRINT("\nBaseProcessStart(..) - setting up exception frame.\n\n"); + __try1(_except_handler) { uExitCode = (lpStartAddress)((PVOID)lpParameter); @@ -207,6 +221,8 @@ BaseProcessStart(LPTHREAD_START_ROUTINE lpStartAddress, { } + DPRINT("\nBaseProcessStart(..) - cleaned up exception frame.\n\n"); + ExitThread(uExitCode); } @@ -534,7 +550,7 @@ KlInitPeb (HANDLE ProcessHandle, return(Status); } - DPRINT("Ppb->MaximumLength %x\n", Ppb->MaximumLength); + //DPRINT("Ppb->MaximumLength %x\n", Ppb->MaximumLength); NtWriteVirtualMemory(ProcessHandle, PpbBase, Ppb, @@ -743,9 +759,94 @@ CreateProcessW(LPCWSTR lpApplicationName, hSection = KlMapFile (ImagePathName); if (hSection == NULL) { - return FALSE; +///////////////////////////////////////// + /* + * Inspect the image to determine executable flavour + */ + IO_STATUS_BLOCK IoStatusBlock; + UNICODE_STRING ApplicationNameString; + OBJECT_ATTRIBUTES ObjectAttributes; + PSECURITY_DESCRIPTOR SecurityDescriptor = NULL; + IMAGE_DOS_HEADER DosHeader; + IO_STATUS_BLOCK Iosb; + LARGE_INTEGER Offset; + HANDLE hFile = NULL; + + DPRINT("Inspecting Image Header for image type id\n"); + + // Find the application name + if (!RtlDosPathNameToNtPathName_U((LPWSTR)lpApplicationName, + &ApplicationNameString, NULL, NULL)) { + return FALSE; + } + DPRINT("ApplicationName %S\n",ApplicationNameString.Buffer); + + InitializeObjectAttributes(&ObjectAttributes, + &ApplicationNameString, + OBJ_CASE_INSENSITIVE, + NULL, + SecurityDescriptor); + + // Try to open the executable + Status = NtOpenFile(&hFile, + SYNCHRONIZE|FILE_EXECUTE|FILE_READ_DATA, + &ObjectAttributes, + &IoStatusBlock, + FILE_SHARE_DELETE|FILE_SHARE_READ, + FILE_SYNCHRONOUS_IO_NONALERT|FILE_NON_DIRECTORY_FILE); + + RtlFreeUnicodeString(&ApplicationNameString); + + if (!NT_SUCCESS(Status)) { + DPRINT("Failed to open file\n"); + SetLastErrorByStatus(Status); + return FALSE; + } + + // Read the dos header + Offset.QuadPart = 0; + Status = ZwReadFile(hFile, + NULL, + NULL, + NULL, + &Iosb, + &DosHeader, + sizeof(DosHeader), + &Offset, + 0); + + if (!NT_SUCCESS(Status)) { + DPRINT("Failed to read from file\n"); + SetLastErrorByStatus(Status); + return FALSE; + } + if (Iosb.Information != sizeof(DosHeader)) { + DPRINT("Failed to read dos header from file\n"); + SetLastErrorByStatus(STATUS_INVALID_IMAGE_FORMAT); + return FALSE; + } + + // Check the DOS signature + if (DosHeader.e_magic != IMAGE_DOS_SIGNATURE) { + DPRINT("Failed dos magic check\n"); + SetLastErrorByStatus(STATUS_INVALID_IMAGE_FORMAT); + return FALSE; + } + NtClose(hFile); + + DPRINT("Launching VDM...\n"); + return CreateProcessW(L"ntvdm.exe", + lpApplicationName, + lpProcessAttributes, + lpThreadAttributes, + bInheritHandles, + dwCreationFlags, + lpEnvironment, + lpCurrentDirectory, + lpStartupInfo, + lpProcessInformation); } - +///////////////////////////////////////// /* * Create a new process */