This issue originated on IRC (a person complained about Tomato Jones II not working but the ole errors in the log weren't actually an issue).
With this patch the game boots to the main menu (at least with wine-staging).
From: Aida Jonikienė aidas957@gmail.com
Tomato Jones II queries most of these properties and errors out if any of them aren't found. --- dlls/wbemprox/builtin.c | 107 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 106 insertions(+), 1 deletion(-)
diff --git a/dlls/wbemprox/builtin.c b/dlls/wbemprox/builtin.c index f6991ac2d8a..d0a43bd5c68 100644 --- a/dlls/wbemprox/builtin.c +++ b/dlls/wbemprox/builtin.c @@ -463,27 +463,62 @@ static const struct column col_sysrestore[] = }; static const struct column col_videocontroller[] = { + { L"AcceleratorCapabilities", CIM_UINT16|CIM_FLAG_ARRAY }, { L"AdapterCompatibility", CIM_STRING }, { L"AdapterDACType", CIM_STRING }, { L"AdapterRAM", CIM_UINT32 }, { L"Availability", CIM_UINT16 }, + { L"CapabilityDescriptions", CIM_STRING|CIM_FLAG_ARRAY }, { L"Caption", CIM_STRING|COL_FLAG_DYNAMIC }, + { L"ColorTableEntries", CIM_UINT32 }, { L"ConfigManagerErrorCode", CIM_UINT32 }, + { L"ConfigManagerUserConfig", CIM_BOOLEAN }, + { L"CreationClassName", CIM_STRING }, { L"CurrentBitsPerPixel", CIM_UINT32 }, { L"CurrentHorizontalResolution", CIM_UINT32 }, + { L"CurrentNumberOfColors", CIM_UINT64 }, + { L"CurrentNumberOfColumns", CIM_UINT32 }, + { L"CurrentNumberOfRows", CIM_UINT32 }, { L"CurrentRefreshRate", CIM_UINT32 }, { L"CurrentScanMode", CIM_UINT16 }, { L"CurrentVerticalResolution", CIM_UINT32 }, { L"Description", CIM_STRING|COL_FLAG_DYNAMIC }, { L"DeviceId", CIM_STRING|COL_FLAG_KEY }, + { L"DeviceSpecificPens", CIM_UINT32 }, + { L"DitherType", CIM_UINT32 }, { L"DriverDate", CIM_DATETIME }, { L"DriverVersion", CIM_STRING }, + { L"ErrorCleared", CIM_BOOLEAN }, + { L"ErrorDescription", CIM_STRING }, + { L"ICMIntent", CIM_UINT32 }, + { L"ICMMethod", CIM_UINT32 }, + { L"InfFilename", CIM_STRING }, + { L"InfSection", CIM_STRING }, { L"InstalledDisplayDrivers", CIM_STRING }, + { L"LastErrorCode", CIM_UINT32 }, + { L"MaxMemorySupported", CIM_UINT32 }, + { L"MaxNumberControlled", CIM_UINT32 }, + { L"MaxRefreshRate", CIM_UINT32 }, + { L"MinRefreshRate", CIM_UINT32 }, + { L"Monochrome", CIM_BOOLEAN }, { L"Name", CIM_STRING|COL_FLAG_DYNAMIC }, + { L"NumberOfColorPlanes", CIM_UINT16 }, + { L"NumberofVideoPages", CIM_UINT32 }, { L"PNPDeviceID", CIM_STRING|COL_FLAG_DYNAMIC }, + { L"PowerManagementCapabilities", CIM_UINT16|CIM_FLAG_ARRAY }, + { L"PowerManagementSupported", CIM_BOOLEAN }, + { L"ProtocolSupported", CIM_UINT16 }, + { L"ReservedSystemPaletteEntries", CIM_UINT32 }, + { L"SpecificationVersion", CIM_UINT32 }, { L"Status", CIM_STRING }, + { L"StatusInfo", CIM_UINT16 }, + { L"SystemCreationClassName", CIM_STRING }, + { L"SystemName", CIM_STRING }, + { L"SystemPaletteEntries", CIM_UINT32 }, + { L"TimeOfLastReset", CIM_DATETIME }, { L"VideoArchitecture", CIM_UINT16 }, { L"VideoMemoryType", CIM_UINT16 }, + { L"VideoMode", CIM_UINT16 }, { L"VideoModeDescription", CIM_STRING|COL_FLAG_DYNAMIC }, { L"VideoProcessor", CIM_STRING|COL_FLAG_DYNAMIC }, }; @@ -918,27 +953,62 @@ struct record_systemenclosure }; struct record_videocontroller { + const struct array *accelerator_caps; const WCHAR *adapter_compatibility; const WCHAR *adapter_dactype; UINT32 adapter_ram; UINT16 availability; + const struct array *capability_desc; const WCHAR *caption; + UINT32 color_table_entries; UINT32 config_errorcode; + int config_userconfig; + const WCHAR *creation_class_name; UINT32 current_bitsperpixel; UINT32 current_horizontalres; + UINT64 current_numcolors; + UINT32 current_numcolumns; + UINT32 current_numrows; UINT32 current_refreshrate; UINT16 current_scanmode; UINT32 current_verticalres; const WCHAR *description; const WCHAR *device_id; + UINT32 device_pens; + UINT32 dither_type; const WCHAR *driverdate; const WCHAR *driverversion; + int error_cleared; + const WCHAR *error_desc; + UINT32 icm_intent; + UINT32 icm_method; + const WCHAR *inf_name; + const WCHAR *infsection; const WCHAR *installeddriver; + UINT32 lasterror; + UINT32 max_memory; + UINT32 max_number; + UINT32 max_refresh; + UINT32 min_refresh; + int monochrome; const WCHAR *name; + UINT16 number_planes; + UINT32 number_pages; const WCHAR *pnpdevice_id; + const struct array *power_caps; + int power_supported; + UINT16 protocol_supported; + UINT32 reserved_entries; + UINT32 spec_version; const WCHAR *status; + UINT16 status_info; + const WCHAR *systemclass_name; + const WCHAR *system_name; + UINT32 system_entries; + const WCHAR *time_reset; UINT16 videoarchitecture; UINT16 videomemorytype; + UINT16 videomode; const WCHAR *videomodedescription; const WCHAR *videoprocessor; }; @@ -4192,28 +4262,63 @@ static enum fill_status fill_videocontroller( struct table *table, const struct }
rec = (struct record_videocontroller *)table->data; + rec->accelerator_caps = NULL; rec->adapter_compatibility = L"(Standard display types)"; rec->adapter_dactype = L"Integrated RAMDAC"; rec->adapter_ram = vidmem; rec->availability = 3; /* Running or Full Power */ - rec->config_errorcode = 0; /* no error */ + rec->capability_desc = NULL; rec->caption = wcsdup( name ); + rec->color_table_entries = 0; + rec->config_errorcode = 0; /* no error */ + rec->config_userconfig = 0; + rec->creation_class_name = NULL; rec->current_bitsperpixel = get_bitsperpixel( &hres, &vres ); rec->current_horizontalres = hres; + rec->current_numcolors = 0; + rec->current_numcolumns = 0; + rec->current_numrows = 0; rec->current_refreshrate = 0; /* default refresh rate */ rec->current_scanmode = 2; /* Unknown */ rec->current_verticalres = vres; rec->description = wcsdup( name ); rec->device_id = L"VideoController1"; + rec->device_pens = 0; + rec->dither_type = 0; rec->driverdate = L"20230420000000.000000-000"; rec->driverversion = L"31.0.14051.5006"; + rec->error_cleared = 0; + rec->error_desc = NULL; + rec->icm_intent = 0; + rec->icm_method = 0; + rec->inf_name = NULL; + rec->infsection = NULL; rec->installeddriver = get_videocontroller_installeddriver( desc.VendorId ); + rec->lasterror = 0; + rec->max_memory = 0; + rec->max_number = 0; + rec->max_refresh = 0; + rec->min_refresh = 0; + rec->monochrome = 0; rec->name = wcsdup( name ); + rec->number_planes = 0; + rec->number_pages = 0; rec->pnpdevice_id = get_videocontroller_pnpdeviceid( &desc ); + rec->power_caps = NULL; + rec->power_supported = 0; + rec->protocol_supported = 0; + rec->reserved_entries = 0; + rec->spec_version = 0; rec->status = L"OK"; + rec->status_info = 0; + rec->systemclass_name = NULL; + rec->system_name = NULL; + rec->system_entries = 0; + rec->time_reset = NULL; rec->videoarchitecture = 2; /* Unknown */ rec->videomemorytype = 2; /* Unknown */ swprintf( mode, ARRAY_SIZE( mode ), L"%u x %u x %I64u colors", hres, vres, (UINT64)1 << rec->current_bitsperpixel ); + rec->videomode = 0; rec->videomodedescription = wcsdup( mode ); rec->videoprocessor = wcsdup( name ); if (!match_row( table, row, cond, &status )) free_row_values( table, row );
Please try to find the minimal set of properties.
On Thu Mar 21 15:38:42 2024 +0000, Hans Leidekker wrote:
Please try to find the minimal set of properties.
I extracted the game's script and these are actually all of the properties that the game queries which confirms the behavior I saw in +ole logs (which is why I'm skeptical of this being upstreamable)
On Thu Mar 21 15:38:42 2024 +0000, Aida Jonikienė wrote:
I extracted the game's script and these are actually all of the properties that the game queries which confirms the behavior I saw in +ole logs (which is why I'm skeptical of this being upstreamable)
That doesn't necessarily mean that it needs all those properties to exist.
On Thu Mar 21 16:06:05 2024 +0000, Hans Leidekker wrote:
That doesn't necessarily mean that it needs all those properties to exist.
If any of them don't exist then the game throws a "The requested action with this object has failed" error and fails to launch
On Thu Mar 21 16:11:50 2024 +0000, Aida Jonikienė wrote:
If any of them don't exist then the game throws a "The requested action with this object has failed" error and fails to launch
Split the patch into parts.
Split the patch into parts.
@infyquest I'll do that if I implement some of those properties (but I think having 30 tiny commits doesn't make sense)
On Thu Mar 21 16:22:05 2024 +0000, Aida Jonikienė wrote:
Split the patch into parts.
@infyquest I'll do that if I implement some of those properties (but I think having 30 tiny commits doesn't make sense)
Or batch them, 3-5 properties in one patch, so that it reduces to around 5-6 patches.
On Thu Mar 21 17:18:23 2024 +0000, Vijay Kiran Kamuju wrote:
Or batch them, 3-5 properties in one patch, so that it reduces to around 5-6 patches.
Is it possible to run that script standalone? If so, could you send it to me?
On Thu Mar 21 18:31:49 2024 +0000, Hans Leidekker wrote:
Is it possible to run that script standalone? If so, could you send it to me?
@hans The script uses AutoIt v3 (but some parts of it depend on game files; it could be used after some modifications though)
I could send it but I'm not sure if I can send a part of a closed-source game
On Thu Mar 21 21:45:01 2024 +0000, Aida Jonikienė wrote:
@hans The script uses AutoIt v3 (but some parts of it depend on game files; it could be used after some modifications though) I could send it but I'm not sure if I can send a part of a closed-source game
Alright, I'll see if I can reproduce this myself.
On Fri Mar 22 07:47:51 2024 +0000, Hans Leidekker wrote:
Alright, I'll see if I can reproduce this myself.
The script goes through wbemdisp. It calls GetIDsOfNames() for each property and expects it to succeed. wbemdisp builds the list of IDs by enumerating wbemprox properties, so you were right, we will need to add these properties there.