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();
}