From 953849f2fc3890d77f256949b8b3f90277b449e0 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Wed, 8 Oct 2003 03:51:31 +0000 Subject: [PATCH] Added hack to call CreateFileW through a pointer so that we don't need to link to kernel functions. Commented out SMB support in NtReadFile for now. --- dlls/kernel/process.c | 3 ++- dlls/ntdll/file.c | 9 +++++---- dlls/ntdll/loader.c | 7 ++++--- dlls/ntdll/ntdll_misc.h | 10 +++++++++- dlls/ntdll/path.c | 9 +++++++-- include/module.h | 2 +- 6 files changed, 28 insertions(+), 12 deletions(-) diff --git a/dlls/kernel/process.c b/dlls/kernel/process.c index c0d8f1dd6b0..dc52e3672a1 100644 --- a/dlls/kernel/process.c +++ b/dlls/kernel/process.c @@ -761,7 +761,8 @@ void __wine_process_init( int argc, char *argv[] ) if (!build_command_line( argv )) goto error; /* create 32-bit module for main exe */ - if (!(current_process.module = BUILTIN32_LoadExeModule( current_process.module ))) goto error; + if (!(current_process.module = BUILTIN32_LoadExeModule( current_process.module, CreateFileW ))) + goto error; stack_size = RtlImageNtHeader(current_process.module)->OptionalHeader.SizeOfStackReserve; /* allocate main thread stack */ diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c index 1dfa50b1b80..47312e84ebc 100644 --- a/dlls/ntdll/file.c +++ b/dlls/ntdll/file.c @@ -38,7 +38,6 @@ #include "wine/server.h" #include "async.h" #include "ntdll_misc.h" -#include "../files/smb.h" #include "winternl.h" #include "winioctl.h" @@ -94,8 +93,8 @@ NTSTATUS WINAPI NtOpenFile( return STATUS_OBJECT_NAME_NOT_FOUND; /* FIXME: this calls SetLastError() -> bad */ - *FileHandle = CreateFileW( &filename[strlenW(szDosDevices)], DesiredAccess, ShareAccess, - NULL, OPEN_EXISTING, 0, 0 ); + *FileHandle = pCreateFileW( &filename[strlenW(szDosDevices)], DesiredAccess, ShareAccess, + NULL, OPEN_EXISTING, 0, 0 ); if (*FileHandle == INVALID_HANDLE_VALUE) return STATUS_OBJECT_NAME_NOT_FOUND; return STATUS_SUCCESS; } @@ -415,7 +414,9 @@ NTSTATUS WINAPI NtReadFile(HANDLE hFile, HANDLE hEvent, case FD_TYPE_SMB: FIXME("NIY-SMB\n"); close(unix_handle); - return SMB_ReadFile(hFile, buffer, length, io_status); + /* FIXME */ + /* return SMB_ReadFile(hFile, buffer, length, io_status); */ + return STATUS_INVALID_HANDLE; case FD_TYPE_DEFAULT: /* normal unix files */ diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c index 352e6143f00..ad69abf4747 100644 --- a/dlls/ntdll/loader.c +++ b/dlls/ntdll/loader.c @@ -1313,7 +1313,7 @@ static NTSTATUS find_dll_file( const WCHAR *load_path, const WCHAR *libname, { if ((*pwm = find_basename_module( file_part )) != NULL) return STATUS_SUCCESS; } - *handle = CreateFileW( filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0 ); + *handle = pCreateFileW( filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0 ); return STATUS_SUCCESS; } @@ -1348,7 +1348,7 @@ static NTSTATUS find_dll_file( const WCHAR *load_path, const WCHAR *libname, strcatW( file_part, dllW ); } if ((*pwm = find_fullname_module( filename )) != NULL) return STATUS_SUCCESS; - *handle = CreateFileW( filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0 ); + *handle = pCreateFileW( filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0 ); return STATUS_SUCCESS; overflow: @@ -1881,10 +1881,11 @@ PVOID WINAPI RtlImageRvaToVa( const IMAGE_NT_HEADERS *nt, HMODULE module, * * FIXME: this should be done differently once kernel is properly separated. */ -HMODULE BUILTIN32_LoadExeModule( HMODULE main ) +HMODULE BUILTIN32_LoadExeModule( HMODULE main, void *CreateFileW_ptr ) { static struct builtin_load_info default_info; + pCreateFileW = CreateFileW_ptr; if (!MODULE_GetSystemDirectory( &system_dir )) MESSAGE( "Couldn't get system dir in process init\n"); NtCurrentTeb()->Peb->ImageBaseAddress = main; diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h index 47c69d1d49c..109ef7ded62 100644 --- a/dlls/ntdll/ntdll_misc.h +++ b/dlls/ntdll/ntdll_misc.h @@ -53,13 +53,21 @@ static inline HANDLE ntdll_get_process_heap(void) { return NtCurrentTeb()->Peb->ProcessHeap; } -#define GetProcessHeap() ntdll_get_process_heap() +/* redefine these to make sure we don't reference kernel symbols */ +#define GetProcessHeap() (NtCurrentTeb()->Peb->ProcessHeap) +#define GetCurrentProcessId() ((DWORD)NtCurrentTeb()->ClientId.UniqueProcess) +#define GetCurrentThreadId() ((DWORD)NtCurrentTeb()->ClientId.UniqueThread) static inline RTL_USER_PROCESS_PARAMETERS* ntdll_get_process_pmts(void) { return NtCurrentTeb()->Peb->ProcessParameters; } +/* hack: upcall to kernel */ +extern HANDLE (WINAPI *pCreateFileW)( LPCWSTR filename, DWORD access, DWORD sharing, + LPSECURITY_ATTRIBUTES sa, DWORD creation, + DWORD attributes, HANDLE template ); + /* Device IO */ /* ntdll/cdrom.c.c */ extern NTSTATUS CDROM_DeviceIoControl(DWORD clientID, HANDLE hDevice, diff --git a/dlls/ntdll/path.c b/dlls/ntdll/path.c index 9d94ddf1985..721a7664060 100644 --- a/dlls/ntdll/path.c +++ b/dlls/ntdll/path.c @@ -37,6 +37,11 @@ static const WCHAR DeviceRootW[] = {'\\','\\','.','\\',0}; static const WCHAR NTDosPrefixW[] = {'\\','?','?','\\',0}; static const WCHAR UncPfxW[] = {'U','N','C','\\',0}; +/* FIXME: hack! */ +HANDLE (WINAPI *pCreateFileW)( LPCWSTR filename, DWORD access, DWORD sharing, + LPSECURITY_ATTRIBUTES sa, DWORD creation, + DWORD attributes, HANDLE template ); + #define IS_SEPARATOR(ch) ((ch) == '\\' || (ch) == '/') /*********************************************************************** @@ -67,8 +72,8 @@ DOS_PATHNAME_TYPE WINAPI RtlDetermineDosPathNameType_U( PCWSTR path ) */ BOOLEAN WINAPI RtlDoesFileExists_U(LPCWSTR file_name) { - HANDLE handle = CreateFileW( file_name, 0, FILE_SHARE_READ|FILE_SHARE_WRITE, - NULL, OPEN_EXISTING, 0, 0 ); + HANDLE handle = pCreateFileW( file_name, 0, FILE_SHARE_READ|FILE_SHARE_WRITE, + NULL, OPEN_EXISTING, 0, 0 ); if (handle == INVALID_HANDLE_VALUE) return FALSE; NtClose( handle ); return TRUE; diff --git a/include/module.h b/include/module.h index fddcfc6883b..0f8839f4c7d 100644 --- a/include/module.h +++ b/include/module.h @@ -204,6 +204,6 @@ extern void MODULE_GetLoadOrderA( enum loadorder_type plo[], const WCHAR *app_na const char *path, BOOL win32 ); /* relay32/builtin.c */ -extern HMODULE BUILTIN32_LoadExeModule( HMODULE main ); +extern HMODULE BUILTIN32_LoadExeModule( HMODULE main, void *CreateFileW_ptr ); #endif /* __WINE_MODULE_H */ -- 2.11.4.GIT