|
|
Definition at line 250 of file methods.c.
{
KSMETHOD MethodRequest;
KPROCESSOR_MODE Mode;
NTSTATUS Status = STATUS_SUCCESS;
ULONG Index;
PFNKSFASTHANDLER FastMethodHandler;
if (MethodLength < sizeof(KSPROPERTY))
{
return FALSE;
}
Mode = ExGetPreviousMode();
if (Mode == KernelMode)
{
RtlMoveMemory(&MethodRequest, Method, sizeof(KSMETHOD));
}
else
{
_SEH2_TRY
{
ProbeForRead(Method, sizeof(KSPROPERTY), sizeof(UCHAR));
RtlMoveMemory(&MethodRequest, Method, sizeof(KSMETHOD));
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
Status = _SEH2_GetExceptionCode();
}_SEH2_END;
if (!NT_SUCCESS(Status))
return FALSE;
}
if (MethodSetsCount)
{
Index = 0;
do
{
if (IsEqualGUIDAligned(MethodSet[Index].Set, &MethodRequest.Set))
{
Status = FindFastMethodHandler(MethodSet[Index].FastIoCount, MethodSet[Index].FastIoTable, &MethodRequest, &FastMethodHandler);
if (NT_SUCCESS(Status))
{
ASSERT(MethodLength == sizeof(KSMETHOD));
ASSERT(Mode == KernelMode);
return FastMethodHandler(FileObject, &MethodRequest, sizeof(KSMETHOD), Data, DataLength, IoStatus);
}
}
Index++;
}while(Index < MethodSetsCount);
}
return FALSE;
}
|