mirror of
https://github.com/reactos/reactos.git
synced 2024-12-29 02:25:17 +00:00
[WINESYNC] msi: GetBinaryType() doesn't accept DLLs.
With help from Dmitry Timoshkov. Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51790 Signed-off-by: Hans Leidekker <hans@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org> wine commit id 4aa858c9badfb35bcc3cdd38abfd40dc5b06c696 by Hans Leidekker <hans@codeweavers.com>
This commit is contained in:
parent
faea5bf012
commit
3d6aaff254
2 changed files with 53 additions and 5 deletions
|
@ -16,7 +16,6 @@ list(APPEND SOURCE
|
|||
automation.c
|
||||
classes.c
|
||||
create.c
|
||||
custom.c
|
||||
database.c
|
||||
delete.c
|
||||
dialog.c
|
||||
|
@ -58,6 +57,7 @@ add_rpc_files(server winemsi.idl)
|
|||
set(IDL_FLAGS ${OLD_IDL_FLAGS})
|
||||
|
||||
list(APPEND PCH_SKIP_SOURCE
|
||||
custom.c # Need custom defines for WIN32_NO_STATUS
|
||||
suminfo.c # The only file without NONAMELESSUNION
|
||||
${BISON_cond_OUTPUTS}
|
||||
${BISON_sql_OUTPUTS}
|
||||
|
|
|
@ -22,6 +22,9 @@
|
|||
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "ntstatus.h"
|
||||
#define WIN32_NO_STATUS
|
||||
#include "windef.h"
|
||||
#include "winbase.h"
|
||||
#include "winerror.h"
|
||||
|
@ -39,9 +42,9 @@
|
|||
#include "wine/exception.h"
|
||||
|
||||
#ifdef __REACTOS__
|
||||
#ifndef STATUS_ACCESS_VIOLATION
|
||||
#define STATUS_ACCESS_VIOLATION ((NTSTATUS)0xC0000005)
|
||||
#endif
|
||||
#undef WIN32_NO_STATUS
|
||||
#include <psdk/ntstatus.h>
|
||||
#include <ndk/mmfuncs.h>
|
||||
#endif
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(msi);
|
||||
|
@ -718,6 +721,51 @@ static DWORD WINAPI custom_client_thread(void *arg)
|
|||
return rc;
|
||||
}
|
||||
|
||||
/* based on kernel32.GetBinaryTypeW() */
|
||||
static BOOL get_binary_type( const WCHAR *name, DWORD *type )
|
||||
{
|
||||
HANDLE hfile, mapping;
|
||||
NTSTATUS status;
|
||||
|
||||
hfile = CreateFileW( name, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0 );
|
||||
if (hfile == INVALID_HANDLE_VALUE)
|
||||
return FALSE;
|
||||
|
||||
status = NtCreateSection( &mapping, STANDARD_RIGHTS_REQUIRED | SECTION_QUERY, NULL, NULL, PAGE_READONLY,
|
||||
SEC_IMAGE, hfile );
|
||||
CloseHandle( hfile );
|
||||
|
||||
switch (status)
|
||||
{
|
||||
case STATUS_SUCCESS:
|
||||
{
|
||||
SECTION_IMAGE_INFORMATION info;
|
||||
|
||||
status = NtQuerySection( mapping, SectionImageInformation, &info, sizeof(info), NULL );
|
||||
CloseHandle( mapping );
|
||||
if (status) return FALSE;
|
||||
switch (info.Machine)
|
||||
{
|
||||
case IMAGE_FILE_MACHINE_I386:
|
||||
case IMAGE_FILE_MACHINE_ARMNT:
|
||||
*type = SCS_32BIT_BINARY;
|
||||
return TRUE;
|
||||
case IMAGE_FILE_MACHINE_AMD64:
|
||||
case IMAGE_FILE_MACHINE_ARM64:
|
||||
*type = SCS_64BIT_BINARY;
|
||||
return TRUE;
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
case STATUS_INVALID_IMAGE_WIN_64:
|
||||
*type = SCS_64BIT_BINARY;
|
||||
return TRUE;
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
static msi_custom_action_info *do_msidbCustomActionTypeDll(
|
||||
MSIPACKAGE *package, INT type, LPCWSTR source, LPCWSTR target, LPCWSTR action )
|
||||
{
|
||||
|
@ -765,7 +813,7 @@ static msi_custom_action_info *do_msidbCustomActionTypeDll(
|
|||
info->package->rpc_server_started = 1;
|
||||
}
|
||||
|
||||
ret = GetBinaryTypeW(source, &info->arch);
|
||||
ret = get_binary_type(source, &info->arch);
|
||||
if (!ret)
|
||||
info->arch = (sizeof(void *) == 8 ? SCS_64BIT_BINARY : SCS_32BIT_BINARY);
|
||||
|
||||
|
|
Loading…
Reference in a new issue