Zebediah Figura : ntdll: Compare builtins by their device and inode number directly.
Alexandre Julliard
julliard at winehq.org
Wed Jul 29 15:47:01 CDT 2020
Module: wine
Branch: master
Commit: 3f8d60e2ac5997766f19107aef23e351c7d68a03
URL: https://source.winehq.org/git/wine.git/?a=commit;h=3f8d60e2ac5997766f19107aef23e351c7d68a03
Author: Zebediah Figura <z.figura12 at gmail.com>
Date: Wed Jul 29 11:41:04 2020 -0500
ntdll: Compare builtins by their device and inode number directly.
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ntdll/unix/loader.c | 21 ++++++++++++---------
1 file changed, 12 insertions(+), 9 deletions(-)
diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c
index afb6405864..499d9bf58b 100644
--- a/dlls/ntdll/unix/loader.c
+++ b/dlls/ntdll/unix/loader.c
@@ -129,7 +129,8 @@ static HMODULE ntdll_module;
struct file_id
{
- BYTE ObjectId[16];
+ dev_t dev;
+ ino_t ino;
};
struct builtin_module
@@ -142,13 +143,17 @@ struct builtin_module
static struct list builtin_modules = LIST_INIT( builtin_modules );
-static NTSTATUS add_builtin_module( void *module, void *handle, const FILE_OBJECTID_BUFFER *id )
+static NTSTATUS add_builtin_module( void *module, void *handle, const struct stat *st )
{
struct builtin_module *builtin;
if (!(builtin = malloc( sizeof(*builtin) ))) return STATUS_NO_MEMORY;
builtin->handle = handle;
builtin->module = module;
- if (id) memcpy( &builtin->id, id->ObjectId, sizeof(builtin->id) );
+ if (st)
+ {
+ builtin->id.dev = st->st_dev;
+ builtin->id.ino = st->st_ino;
+ }
else memset( &builtin->id, 0, sizeof(builtin->id) );
list_add_tail( &builtin_modules, &builtin->entry );
return STATUS_SUCCESS;
@@ -996,9 +1001,7 @@ static NTSTATUS open_dll_file( const char *name, void **module, pe_image_info_t
{
struct builtin_module *builtin;
OBJECT_ATTRIBUTES attr = { sizeof(attr) };
- IO_STATUS_BLOCK io;
LARGE_INTEGER size;
- FILE_OBJECTID_BUFFER id;
struct stat st;
SIZE_T len = 0;
NTSTATUS status;
@@ -1017,11 +1020,11 @@ static NTSTATUS open_dll_file( const char *name, void **module, pe_image_info_t
return STATUS_DLL_NOT_FOUND;
}
- if (!NtFsControlFile( handle, 0, NULL, NULL, &io, FSCTL_GET_OBJECT_ID, NULL, 0, &id, sizeof(id) ))
+ if (!stat( name, &st ))
{
LIST_FOR_EACH_ENTRY( builtin, &builtin_modules, struct builtin_module, entry )
{
- if (!memcmp( &builtin->id, id.ObjectId, sizeof(builtin->id) ))
+ if (builtin->id.dev == st.st_dev && builtin->id.ino == st.st_ino)
{
TRACE( "%s is the same file as existing module %p\n", debugstr_a(name),
builtin->module );
@@ -1032,7 +1035,7 @@ static NTSTATUS open_dll_file( const char *name, void **module, pe_image_info_t
}
}
}
- else memset( id.ObjectId, 0, sizeof(id.ObjectId) );
+ else memset( &st, 0, sizeof(st) );
size.QuadPart = 0;
status = NtCreateSection( &mapping, STANDARD_RIGHTS_REQUIRED | SECTION_QUERY |
@@ -1063,7 +1066,7 @@ static NTSTATUS open_dll_file( const char *name, void **module, pe_image_info_t
status = STATUS_IMAGE_MACHINE_TYPE_MISMATCH;
}
- if (!status) status = add_builtin_module( *module, NULL, &id );
+ if (!status) status = add_builtin_module( *module, NULL, &st );
if (status)
{
More information about the wine-cvs
mailing list