Firstly, I would like to describe what kind of issues we actually experienced and later on how we managed to solve them.
Our software runs on hundreds of machines and as PUBG is by far the most played game it became our main focus for testing. At start, these problems didn't seem to happen so often but soon after it became almost impossible to finish a game without getting some kind of error.
Examples of error messages (we pretty much experienced all of them at one point).
BattlEye: Query timeout
BattlEye: Client not responding
BattlEye: Bad Service Version
BE service is not running properly
The ones stated above didn't have any relatable patterns, all happened at random times, and mostly always prevented player from returning to the game.
To make things much worse, shortly after we started experiencing these initial problems, the one that bugged us the most has arisen. All of the games using BattlEye started freezing permanently, without option to continue the game and almost always required machine reboot in order to resolve system functionality.
In the beginning it seemed like it is as random as all of the other errors but soon we noticed a pattern. This kind of full game freeze always happened at mid - end phase of the game in the time when player interaction is at it's peak. This led to almost two weeks of heavy testing from our side in order to find a valid solution for this problem.
Taking all of these observations into account, the testing started with assumption of BattlEye doing some kind of eliminatory anti-cheat check at mid - end game time frame.
In order to fully understand our testing phase I should tell you a bit about how our software cohabitates inside the Windows OS. Unlike all of the other solutions, our main goal was to integrate into OS without restricting any of it's crucial functionalities. For example, the simplest way to restrict user actions, which all of the other solutions use, is to completely replace Windows shell (Explorer) and run your own implementation instead. Do not get me wrong, replacing user shell is a completely native solution but it brings some major issues. Main problem with shell replacement is improper driver installation. Some of the most crucial drivers for gaming, like graphics drivers, are unable to properly finish setup without fully featured Explorer running. Since Explorer is Windows's original shell it will never run if the shell is replaced.
While Microsoft assures us all the system services remain functional after shell replacement, this is not the case. I'm not going to lie to you, back in the beta phase of our software our solution was based on shell replacement but, thanks to the intensive debugging phase, this is not the case anymore.