M Bealby wrote:
I was just taking a look at some ReactOS code this
evening and it got
me thinking about what our general strategy for handling invalid
parameters is.
For example, in kernel32.dll there is a function DebugBreakProcess.
This function takes one parameter, a process handle.
This parameter is passed through the following list of functions
unchecked by any of them, until the final one will return a failure...
DebugBreakProcess
Adding the check here means that if someone calls the Native API
directly the check is skipped, and this the one in the win32 api is useless.
DbgUiIssueRemoteBreakIn
Adding the check here cuts the problem short, but now it means every API
that uses a process handle now needs to check the parameter, thus adding
thousands of lines of duplicated code. The same argument goes for the
ones below
RtlCreateUserThread
RtlpCreateUserStack
ZwAllocateVirtualMemory
Since process handles are the responsability of the object manager, it
is the lowest place and the only place that should report this failure.
Rtl code shouldn't make assumptions about what is a valid handle and
what is not. If one day a new object manager is created which uses
negative handles as correct handles, and the 0 handle as "Current
process" handle, then thousands of lines of code woul dhave to be
changed. By leaving the responsability of determing what is and what
isn't a valid handle to the object manager itself, this keeps the kernel
componentized and mostly independent.
ObReferenceObjectByHandle
Best regards,
Alex Ionescu