It's very difficult to get Myst III: Exile running on modern Windows if you only use the original media. Though ScummVM can run the original Myst and its sequel Riven, it doesn't work on Myst 3. For that, you'll need its sister project, ResidualVM.
The folder structures you'll need to copy from installation media vary depending on which ResidualVM build you use. If you use the latest stable release, follow the instructions on the web site. If you use the newest development build, use the ones in the GitHub repository.
Various technical articles, IT-related tutorials, software information, and development journals
Wednesday, December 14, 2016
Tuesday, December 13, 2016
AbiathRPC - Clean up old WCF instances
I just noticed that the AbiathRPC server never properly disposed of communication objects for clients that had abruptly disconnected; they just hung around in the list of server object instances. Since they're in that list, the server always tried to notify them of new events. Today I added some code to the routine that runs every ten minutes to save the levels if necessary. It now goes through all the current connections and removes the ones that are no longer working.
I also found that non-authenticated clients received event notifications because they were in the list, so I made the "notify all the other clients" routine only send the data to authenticated users.
I also found that non-authenticated clients received event notifications because they were in the list, so I made the "notify all the other clients" routine only send the data to authenticated users.
Monday, December 12, 2016
Volunteering at a rescheduled FTC meet
The last FTC robotics meet in the area was cut short due to difficulties with the electronics in the beacons. Its second slate of matches was hastily rescheduled to today. For an unexpected meet, it was arranged very nicely, with a practice field and a competition field that worked well. Though I was assigned to do field inspections again, I could not arrive in time for those because I had to take some exams. I did manage to handle field reset for all but two of the matches. There was only one beacon-related problem, and the referees had a spare one on hand with which to swap it out.
Sunday, December 11, 2016
Testing whether a given user is an administrator with PowerShell
Given a user object $u, you can use this PowerShell line to check whether that user is an administrator, i.e. a member of the Administrators group:
(Get-LocalGroupMember 'Administrators' | ? {$_.SID -eq $u.SID}).Count -ne 0
User objects come from the Get-LocalUser or Get-LocalGroupMember cmdlets. The former lets you get a user by name, which is more useful here.
Based on my Super User answer.
(Get-LocalGroupMember 'Administrators' | ? {$_.SID -eq $u.SID}).Count -ne 0
User objects come from the Get-LocalUser or Get-LocalGroupMember cmdlets. The former lets you get a user by name, which is more useful here.
Based on my Super User answer.
Saturday, December 10, 2016
How Windows Firewall knows whether it has prompted the user to allow a program
When a program tries to start listening in a manner that doesn't match an existing firewall rule, Windows Firewall pops up a dialog asking whether to allow the program through the firewall. No matter whether you choose "Cancel" or the choice that lets it through, a new rule is created, to block or allow traffic from that EXE, respectively. The interesting part is that rules created in this way are marked specially in the Registry. All the rules are kept here:
Each program-related prompt creates two rules, one for TCP and one for UDP. The Registry value names start with TCP Query User and UDP Query User, respectively. To bring the prompt back, remove those rules either by deleting them in the Windows Firewall MMC snap-in, or by deleting the corresponding Registry values then restarting the Windows Firewall service.
Based on my Super User answer.
HKLM\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules
Each program-related prompt creates two rules, one for TCP and one for UDP. The Registry value names start with TCP Query User and UDP Query User, respectively. To bring the prompt back, remove those rules either by deleting them in the Windows Firewall MMC snap-in, or by deleting the corresponding Registry values then restarting the Windows Firewall service.
Based on my Super User answer.
Friday, December 9, 2016
AbiathRPC - Password hashing
AbiathRPC server operators can allow users to authenticate by password or VeriMaps certificate. The VeriMaps certificates themselves are never seen by the server, but servers did store the plaintext passwords. Today I made the password authentication system using hashing, so people's passwords aren't on disk. This has the added advantage of stopping bizarre characters in new passwords from breaking the configuration file.
Server operators can still easily give people initial passwords; there's a PasswordIsHashed field that determines whether the user record's password field should be considered a hash instead of a plaintext. A plaintext will be automatically hashed at startup.
Server operators can still easily give people initial passwords; there's a PasswordIsHashed field that determines whether the user record's password field should be considered a hash instead of a plaintext. A plaintext will be automatically hashed at startup.
Thursday, December 8, 2016
AbiathRPC - Reconnection crash fixed
Yesterday I mentioned an AbiathRPC bug that caused the opening of a remote level set to fail after closing one that was opened successfully. I found that the crash occurred when setting up the watchdog render planes; an original GalaxyLevel was incorrectly cast to a TaggedGalaxyLevel in the method that looks up a level ID for a given level wrapper.
The problem was that the bookkeeping on level substitutions wasn't nullified at disconnection. That made the ID lookup function think the connection was complete when it's wasn't. The old level objects were also kept around, which is less than ideal. I added a single line to the connection-closing method to fix the problem.
The problem was that the bookkeeping on level substitutions wasn't nullified at disconnection. That made the ID lookup function think the connection was complete when it's wasn't. The old level objects were also kept around, which is less than ideal. I added a single line to the connection-closing method to fix the problem.
Subscribe to:
Posts (Atom)