📄 unifiedkernel-0.2.0-w0.9.11.diff
字号:
++ mark = &NtCurrentTeb()->Peb->LdrData->InMemoryOrderModuleList;+ for (entry = mark->Flink; entry != mark; entry = entry->Flink)+ {+ mod = CONTAINING_RECORD(entry, LDR_MODULE, InMemoryOrderModuleList);+ if (!strcmpiW(ptr, mod->FullDllName.Buffer)){+ cached_modref = CONTAINING_RECORD(mod, WINE_MODREF, ldr);+ return mod->SectionHandle;+ }+ }+ RtlFreeHeap( GetProcessHeap(), 0, ptr );+ return NULL;+ }+}++/*+ * find symbol in loaded builtin dll+ */+void *find_builtin_symbol(char *dll_name, char *symbol)+{+ void *dll_handle = get_dll_handle(dll_name);+ char error[1024];+ int err_size = sizeof(error); + return wine_dlsym(dll_handle, symbol, error, err_size);+}+#endif /****************************************************************** * LdrInitializeThunk (NTDLL.@) *@@ -2094,6 +2177,10 @@ PEB *peb = NtCurrentTeb()->Peb; IMAGE_NT_HEADERS *nt = RtlImageNtHeader( peb->ImageBaseAddress ); +#ifdef UNIFIED_KERNEL+ wine_dll_set_callback(load_builtin_callback);+ main_exe_file = 0;+#endif if (main_exe_file) NtClose( main_exe_file ); /* at this point the main module is created */ /* allocate the modref for the main exe (if not already done) */@@ -2137,6 +2224,17 @@ load_path = NtCurrentTeb()->Peb->ProcessParameters->DllPath.Buffer; if ((status = fixup_imports( wm, load_path )) != STATUS_SUCCESS) goto error;+#ifdef UNIFIED_KERNEL+ /* get process start address from kernel32.dll*/+ if (!(BaseProcessStartEntry = (unsigned long) find_builtin_symbol("kernel32.dll", "BaseProcessStart")))+ goto error;+ + if (!(process_init = find_builtin_symbol("kernel32.dll", "process_init")))+ goto error;+ + process_init();++#endif if ((status = alloc_process_tls()) != STATUS_SUCCESS) goto error; if ((status = alloc_thread_tls()) != STATUS_SUCCESS) goto error; if ((status = process_attach( wm, (LPVOID)1 )) != STATUS_SUCCESS)@@ -2265,6 +2363,10 @@ { PLIST_ENTRY mark, entry; LPWSTR buffer, p;+#ifdef UNIFIED_KERNEL+ WCHAR kernel32[] = {'k', 'e', 'r', 'n', 'e', 'l', '3', '2', '.' ,'d' ,'l' ,'l' , '\0'};+ WCHAR ntdll[] = {'n', 't', 'd', 'l', 'l', '.', 'd', 'l', 'l', '\0'};+#endif RtlCreateUnicodeString( &system_dir, sysdir ); @@ -2274,6 +2376,12 @@ { LDR_MODULE *mod = CONTAINING_RECORD( entry, LDR_MODULE, InLoadOrderModuleList ); +#ifdef UNIFIED_KERNEL+ /* this should be done just for kernel32.dll and ntdll.dll */+ if (strcmpiW(mod->BaseDllName.Buffer, kernel32) + && strcmpiW(mod->BaseDllName.Buffer, ntdll))+ continue;+#endif assert( mod->Flags & LDR_WINE_INTERNAL ); buffer = RtlAllocateHeap( GetProcessHeap(), 0,diff -Nru wine-0.9.11.ori/dlls/ntdll/Makefile.in wine-0.9.11/dlls/ntdll/Makefile.in--- wine-0.9.11.ori/dlls/ntdll/Makefile.in 2006-03-31 20:38:27.000000000 +0800+++ wine-0.9.11/dlls/ntdll/Makefile.in 2007-03-23 09:53:02.000000000 +0800@@ -50,13 +50,15 @@ threadpool.c \ time.c \ virtual.c \- wcstring.c+ wcstring.c \+ init.c EXTRA_OBJS = relay32.o SUBDIRS = tests @MAKE_DLL_RULES@+LDRPATH += -Wl,--script,ld.s relay32.o: $(WINEBUILD) $(WINEBUILD) $(WINEBUILDFLAGS) -o $@ --relay32diff -Nru wine-0.9.11.ori/dlls/ntdll/nt.c wine-0.9.11/dlls/ntdll/nt.c--- wine-0.9.11.ori/dlls/ntdll/nt.c 2006-03-31 20:38:27.000000000 +0800+++ wine-0.9.11/dlls/ntdll/nt.c 2007-03-23 09:54:21.000000000 +0800@@ -391,9 +391,21 @@ IN ULONG Length, OUT PULONG ResultLength) {+#ifndef UNIFIED_KERNEL FIXME("(%p,%d,%p,0x%08lx,%p) stub!\n", SectionHandle,SectionInformationClass,SectionInformation,Length,ResultLength); return 0;+#else+ NTSTATUS ret;+ + __asm__ __volatile__ (+ "movl $0x89,%%eax\n\t"+ "lea 8(%%ebp),%%edx\n\t"+ "int $0x2E\n\t"+ :"=a" (ret)+ );+ return ret;+#endif } /*diff -Nru wine-0.9.11.ori/dlls/ntdll/ntdll.spec wine-0.9.11/dlls/ntdll/ntdll.spec--- wine-0.9.11.ori/dlls/ntdll/ntdll.spec 2006-03-31 20:38:27.000000000 +0800+++ wine-0.9.11/dlls/ntdll/ntdll.spec 2007-03-23 09:53:02.000000000 +0800@@ -134,7 +134,7 @@ @ stdcall NtCreateNamedPipeFile(ptr long ptr ptr long long long long long long long long long ptr) @ stdcall NtCreatePagingFile(long long long long) @ stdcall NtCreatePort(ptr ptr long long ptr)-@ stub NtCreateProcess+# @ stub NtCreateProcess # @ stub NtCreateProcessEx @ stub NtCreateProfile @ stdcall NtCreateSection(ptr long ptr ptr long long long)@@ -1390,3 +1390,25 @@ @ cdecl wine_nt_to_unix_file_name(ptr ptr long long) @ cdecl wine_unix_to_nt_file_name(ptr ptr) @ cdecl __wine_init_windows_dir(wstr wstr)++# Linux Unified Kernel extensions+# All functions are modified from ReactOS++# Thread+@ cdecl RtlRosCreateUserThread(long ptr long long ptr ptr ptr ptr ptr long long)++# Attributes+@ cdecl RtlRosR32AttribsToNativeAttribs(ptr ptr)+ +# Process+@ stdcall NtCreateProcess(long long ptr long long long long long)++# Handle + # system call NtClose+@ stdcall UkClose(long)++# Handle + # system call NtOpenFile+@ stdcall UkOpenFile(ptr long ptr ptr long long)+@ stdcall UkCreateSection(ptr long ptr ptr long long long)+ diff -Nru wine-0.9.11.ori/dlls/ntdll/om.c wine-0.9.11/dlls/ntdll/om.c--- wine-0.9.11.ori/dlls/ntdll/om.c 2006-03-31 20:38:27.000000000 +0800+++ wine-0.9.11/dlls/ntdll/om.c 2007-03-23 09:54:25.000000000 +0800@@ -344,6 +344,20 @@ return ret; } +#ifdef UNIFIED_KERNEL+NTSTATUS WINAPI UkClose( HANDLE Handle )+{+ NTSTATUS ret;+ __asm__ __volatile__ (+ "movl $0x11,%%eax\n\t"+ "lea 8(%%ebp),%%edx\n\t"+ "int $0x2E\n\t"+ :"=a" (ret)+ );+ return ret;+}+#endif+ /* * Directory functions */diff -Nru wine-0.9.11.ori/dlls/ntdll/process.c wine-0.9.11/dlls/ntdll/process.c--- wine-0.9.11.ori/dlls/ntdll/process.c 2006-03-31 20:38:27.000000000 +0800+++ wine-0.9.11/dlls/ntdll/process.c 2007-03-23 09:54:39.000000000 +0800@@ -41,6 +41,27 @@ * Process object */ +#ifdef UNIFIED_KERNEL+NTSTATUS WINAPI+NtCreateProcess(OUT PHANDLE ProcessHandle,+ IN ACCESS_MASK DesiredAccess,+ IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,+ IN HANDLE ParentProcess,+ IN BOOLEAN InheritObjectTable,+ IN HANDLE SectionHandle OPTIONAL,+ IN HANDLE DebugPort OPTIONAL,+ IN HANDLE ExceptionPort OPTIONAL)+{+ NTSTATUS ret;+ __asm__ __volatile__ (+ "movl $0x22,%%eax\n\t"+ "lea 8(%%ebp),%%edx\n\t"+ "int $0x2E\n\t"+ :"=a" (ret)+ );+ return ret;+}+#endif /****************************************************************************** * NtTerminateProcess [NTDLL.@] *@@ -49,6 +70,7 @@ NTSTATUS WINAPI NtTerminateProcess( HANDLE handle, LONG exit_code ) { NTSTATUS ret;+#ifndef UNIFIED_KERNEL BOOL self; SERVER_START_REQ( terminate_process ) {@@ -59,6 +81,14 @@ } SERVER_END_REQ; if (self) exit( exit_code );+#else+ __asm__ __volatile__ (+ "movl $0xD3,%%eax\n\t"+ "lea 8(%%ebp),%%edx\n\t"+ "int $0x2E\n\t"+ :"=a" (ret)+ );+#endif return ret; } @@ -90,6 +120,7 @@ OUT PULONG ReturnLength) { NTSTATUS ret = STATUS_SUCCESS;+#ifndef UNIFIED_KERNEL ULONG len = 0; TRACE("(%p,0x%08x,%p,0x%08lx,%p)\n",@@ -290,7 +321,14 @@ } if (ReturnLength) *ReturnLength = len;- +#else+ __asm__ __volatile__ (+ "movl $0x7D,%%eax\n\t"+ "lea 8(%%ebp),%%edx\n\t"+ "int $0x2E\n\t"+ :"=a" (ret)+ );+#endif return ret; } @@ -306,6 +344,7 @@ { NTSTATUS ret = STATUS_SUCCESS; +#ifndef UNIFIED_KERNEL switch (ProcessInformationClass) { case ProcessAffinityMask:@@ -344,6 +383,14 @@ ret = STATUS_NOT_IMPLEMENTED; break; }+#else+ __asm__ __volatile__ (+ "movl $0xBA,%%eax\n\t"+ "lea 8(%%ebp),%%edx\n\t"+ "int $0x2E\n\t"+ :"=a" (ret)+ );+#endif return ret; } diff -Nru wine-0.9.11.ori/dlls/ntdll/signal_i386.c wine-0.9.11/dlls/ntdll/signal_i386.c--- wine-0.9.11.ori/dlls/ntdll/signal_i386.c 2006-03-31 20:38:27.000000000 +0800+++ wine-0.9.11/dlls/ntdll/signal_i386.c 2007-03-23 09:53:02.000000000 +0800@@ -669,7 +669,11 @@ *gs = wine_get_gs(); #endif +#ifndef UNIFIED_KERNEL wine_set_fs( thread_regs->fs );+#else+ wine_set_fs(((struct ntdll_thread_regs *)(NtCurrentTeb()->SpareBytes1))->fs);+#endif /* now restore a proper %gs for the fault handler */ if (!wine_ldt_is_system(CS_sig(sigcontext)) ||diff -Nru wine-0.9.11.ori/dlls/ntdll/thread.c wine-0.9.11/dlls/ntdll/thread.c--- wine-0.9.11.ori/dlls/ntdll/thread.c 2006-03-31 20:38:27.000000000 +0800+++ wine-0.9.11/dlls/ntdll/thread.c 2007-03-23 09:54:43.000000000 +0800@@ -17,7 +17,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 */- #include "config.h" #include "wine/port.h" @@ -40,6 +39,9 @@ #include "wine/debug.h" #include "ntdll_misc.h" #include "wine/exception.h"+#ifdef UNIFIED_KERNEL+#include <assert.h>+#endif WINE_DEFAULT_DEBUG_CHANNEL(thread); @@ -57,7 +59,11 @@ static WCHAR current_dir[MAX_NT_PATH_LENGTH]; static RTL_BITMAP tls_bitmap; static RTL_BITMAP tls_expansion_bitmap;+#ifndef UNIFIED_KERNEL static LIST_ENTRY tls_links;+#else+LIST_ENTRY tls_links;+#endif static size_t sigstack_total_size; struct wine_pthread_functions pthread_functions = { NULL };@@ -475,6 +481,544 @@ close( request_pipe[1] ); return status; }+#ifdef UNIFIED_KERNEL+#define ROUNDUP(a, b) ((((a) + (b) - 1)/(b))*(b))++#define PAGE_SIZE 0x1000++#define DEFAULT_STACK_RESERVE (32 * PAGE_SIZE)++#define USER_CS (0x18 + 0x3)+#define USER_DS (0x20 + 0x3)+#define TEB_SELECTOR (0x38 + 0x3)++NTSTATUS WINAPI+NtCreateThread(OUT PHANDLE ThreadHandle,+ IN ACCESS_MASK DesiredAccess,+ IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,+ IN HANDLE ProcessHandle,+ OUT PCLIENT_ID ClientId,+ IN PCONTEXT ThreadContext,+ IN PINITIAL_TEB InitialTeb,+ IN BOOLEAN CreateSuspended)+{+ NTSTATUS ret;+ __asm__ __volatile__ (+ "movl $0x27,%%eax\n\t"+ "lea 8(%%ebp),%%edx\n\t"+ "int $0x2E\n\t"+ :"=a" (ret)+ );+ return ret;+}++VOID RtlRosR32AttribsToNativeAttribs(OUT OBJECT_ATTRIBUTES * NativeAttribs, + IN SECURITY_ATTRIBUTES * Ros32Attribs OPTIONAL)+{+ NativeAttribs->Length = sizeof(*NativeAttribs);+ NativeAttribs->ObjectName = NULL;+ NativeAttribs->RootDirectory = NULL;+ NativeAttribs->Attributes = 0;+ NativeAttribs->SecurityQualityOfService = NULL;+++ if(Ros32Attribs && Ros32Attribs->nLength >= sizeof(*Ros32Attribs)) {+ NativeAttribs->SecurityDescriptor = Ros32Attribs->lpSecurityDescriptor;++ if(Ros32Attribs->bInheritHandle)+ NativeAttribs->Attributes |= OBJ_INHERIT;+ } else+ NativeAttribs->SecurityDescriptor = NULL;+}++NTSTATUS NTAPI RtlpRosGetStackLimits(IN PINITIAL_TEB InitialTeb,+ OUT PVOID * StackBase,+ OUT PVOID * StackLimit)+{+ /* fixed-size stack */+ if(InitialTeb->StackBase && InitialTeb->StackLimit) {+ *StackBase = InitialTeb->StackBase;+ *StackLimit = InitialTeb->StackLimit;+ } else if(InitialTeb->StackCommit && InitialTeb->StackCommitMax) { /* expandable stack */+ *StackBase = InitialTeb->StackCommit;+ *StackLimit = InitialTeb->StackCommitMax;+ } else { /* can't determine the type of stack: failure */+ return STATUS_BAD_INITIAL_STACK;+ }++ /* valid stack */+ return STATUS_SUCCESS;+}++NTSTATUS NTAPI RtlpRosValidateLinearUserStack(IN PVOID StackBase,+ IN PVOID StackLimit,+ IN BOOLEAN Direction)+{+ /* the stack has a null or negative (relatively to its direction) length */+ if (StackBase == StackLimit || (Direction ^ ((PCHAR)StackBase < (PCHAR)StackLimit)))+ return STATUS_BAD_INITIAL_STACK;++ /* valid stack */+ return STATUS_SUCCESS;+}++extern void ProcessStartForward(unsigned long start_address, void *peb);+NTSTATUS NTAPI+RtlRosInitializeContext(IN HANDLE ProcessHandle,+ OUT PCONTEXT Context,+ IN PVOID BaseStartAddress,+ IN PINITIAL_TEB InitialTeb,+ IN ULONG_PTR StartAddress,+ IN ULONG_PTR Parameter)+{+ static PVOID spRetAddr = (PVOID)0xDEADBEEF;++ ULONG nDummy;+ NTSTATUS nErrCode;+ PVOID pStackBase;+ PVOID pStackLimit;+ size_t ReserveSize = 3 * sizeof(ULONG_PTR);++ /* Intel x86: linear top-down stack, all parameters passed on the stack */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -