Casper Hornstrup wrote:
The control flow isn't obvious since NTCALL hides much of the logic. You should rather split the function into smaller functions with sensible names. This will, in many cases, reduce the duplicated error handling code.
Indeed. This was my immediate thought too. Maybe something like this, or maybe not, but you get the idea.
DoNtXXX() { NSTATUS Status;
Status = NtXXX();
cleanupXXX();
return !NT_SUCCESS(Status); }
DoNtZZZ() { NSTATUS Status;
Status = NtZZZ();
cleanupZZZ();
return !NT_SUCCESS(Status); }
DoNtYYY() { NSTATUS Status;
Status = NtYYY();
cleanupYYY();
return !NT_SUCCESS(Status); }
NTSTATUS DoSomething() { return DoNtXXX() || DoNtYYY() || DoNtZZZ(); }