mirror of
https://github.com/reactos/reactos.git
synced 2025-03-10 10:14:44 +00:00
163 lines
4.5 KiB
C++
163 lines
4.5 KiB
C++
![]() |
/*++
|
||
|
|
||
|
Copyright (c) Microsoft. All rights reserved.
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
FxValidateFunctions.h
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Inline functions which validate external WDF data structures
|
||
|
|
||
|
Author:
|
||
|
|
||
|
|
||
|
|
||
|
Environment:
|
||
|
|
||
|
Both kernel and user mode
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
Made it mode agnostic
|
||
|
|
||
|
Moved request options validation to FxRequestValidateFunctions.hpp
|
||
|
in kmdf\inc\private
|
||
|
|
||
|
When request is merged FxRequestValidateFunctions.hpp can be moved to
|
||
|
shared directory
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#ifndef _FXVALIDATEFUNCTIONS_H_
|
||
|
#define _FXVALIDATEFUNCTIONS_H_
|
||
|
|
||
|
extern "C" {
|
||
|
|
||
|
#if defined(EVENT_TRACING)
|
||
|
#include "FxValidateFunctions.hpp.tmh"
|
||
|
#endif
|
||
|
|
||
|
}
|
||
|
|
||
|
enum FX_VALIDATE_FUNCTIONS_FLAGS {
|
||
|
FX_VALIDATE_OPTION_NONE_SPECIFIED = 0x00000000,
|
||
|
FX_VALIDATE_OPTION_PARENT_NOT_ALLOWED = 0x00000001,
|
||
|
FX_VALIDATE_OPTION_EXECUTION_LEVEL_ALLOWED = 0x00000002,
|
||
|
FX_VALIDATE_OPTION_SYNCHRONIZATION_SCOPE_ALLOWED = 0x00000004,
|
||
|
FX_VALIDATE_OPTION_ATTRIBUTES_REQUIRED = 0x00000008,
|
||
|
|
||
|
// not used directly, use FX_VALIDATE_OPTION_PARENT_REQUIRED instead
|
||
|
FX_VALIDATE_OPTION_PARENT_REQUIRED_FLAG = 0x00000010,
|
||
|
|
||
|
// if a parent is required, the attributes themselves are requried
|
||
|
FX_VALIDATE_OPTION_PARENT_REQUIRED = FX_VALIDATE_OPTION_PARENT_REQUIRED_FLAG |
|
||
|
FX_VALIDATE_OPTION_ATTRIBUTES_REQUIRED,
|
||
|
};
|
||
|
|
||
|
_Must_inspect_result_
|
||
|
NTSTATUS
|
||
|
FxValidateObjectAttributes(
|
||
|
__in PFX_DRIVER_GLOBALS FxDriverGlobals,
|
||
|
__in PWDF_OBJECT_ATTRIBUTES Attributes,
|
||
|
__in ULONG Flags = FX_VALIDATE_OPTION_NONE_SPECIFIED
|
||
|
);
|
||
|
|
||
|
_Must_inspect_result_
|
||
|
NTSTATUS
|
||
|
__inline
|
||
|
FxValidateObjectAttributesForParentHandle(
|
||
|
__in PFX_DRIVER_GLOBALS FxDriverGlobals,
|
||
|
__in PWDF_OBJECT_ATTRIBUTES Attributes,
|
||
|
__in ULONG Flags = FX_VALIDATE_OPTION_NONE_SPECIFIED
|
||
|
)
|
||
|
{
|
||
|
if (Attributes == NULL) {
|
||
|
if (Flags & FX_VALIDATE_OPTION_PARENT_REQUIRED) {
|
||
|
DoTraceLevelMessage(
|
||
|
FxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGDEVICE,
|
||
|
"WDF_OBJECT_ATTRIBUTES required, %!STATUS!",
|
||
|
(ULONG) STATUS_WDF_PARENT_NOT_SPECIFIED);
|
||
|
}
|
||
|
return STATUS_WDF_PARENT_NOT_SPECIFIED;
|
||
|
}
|
||
|
|
||
|
if (Attributes->Size != sizeof(WDF_OBJECT_ATTRIBUTES)) {
|
||
|
//
|
||
|
// Size is wrong, bail out
|
||
|
//
|
||
|
DoTraceLevelMessage(FxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGAPIERROR,
|
||
|
"Attributes %p Size incorrect, expected %d, got %d, %!STATUS!",
|
||
|
Attributes, sizeof(WDF_OBJECT_ATTRIBUTES),
|
||
|
Attributes->Size, STATUS_INFO_LENGTH_MISMATCH);
|
||
|
|
||
|
return STATUS_INFO_LENGTH_MISMATCH;
|
||
|
}
|
||
|
|
||
|
if (Attributes->ParentObject == NULL) {
|
||
|
if (Flags & FX_VALIDATE_OPTION_PARENT_REQUIRED) {
|
||
|
DoTraceLevelMessage(
|
||
|
FxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGDEVICE,
|
||
|
"ParentObject required in WDF_OBJECT_ATTRIBUTES %p, %!STATUS!",
|
||
|
Attributes, STATUS_WDF_PARENT_NOT_SPECIFIED);
|
||
|
}
|
||
|
return STATUS_WDF_PARENT_NOT_SPECIFIED;
|
||
|
}
|
||
|
|
||
|
return STATUS_SUCCESS;
|
||
|
}
|
||
|
|
||
|
_Must_inspect_result_
|
||
|
NTSTATUS
|
||
|
__inline
|
||
|
FxValidateUnicodeString(
|
||
|
__in PFX_DRIVER_GLOBALS FxDriverGlobals,
|
||
|
__in PCUNICODE_STRING String
|
||
|
)
|
||
|
{
|
||
|
NTSTATUS status;
|
||
|
|
||
|
status = STATUS_INVALID_PARAMETER;
|
||
|
|
||
|
if (String->Length & 1) {
|
||
|
DoTraceLevelMessage(
|
||
|
FxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGAPIERROR,
|
||
|
"UNICODE_STRING %p, Length %d is odd, %!STATUS!",
|
||
|
String, String->Length, status);
|
||
|
|
||
|
return status;
|
||
|
}
|
||
|
|
||
|
if (String->MaximumLength & 1) {
|
||
|
DoTraceLevelMessage(
|
||
|
FxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGAPIERROR,
|
||
|
"UNICODE_STRING %p, MaximumLength %d is odd, %!STATUS!",
|
||
|
String, String->MaximumLength, status);
|
||
|
|
||
|
return status;
|
||
|
}
|
||
|
|
||
|
if (String->MaximumLength > 0 && String->Buffer == NULL) {
|
||
|
DoTraceLevelMessage(
|
||
|
FxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGAPIERROR,
|
||
|
"UNICODE_STRING %p, MaximumLength %d > 0, Buffer is NULL, %!STATUS!",
|
||
|
String, String->MaximumLength, status);
|
||
|
|
||
|
return status;
|
||
|
}
|
||
|
|
||
|
if (String->Length > String->MaximumLength) {
|
||
|
DoTraceLevelMessage(
|
||
|
FxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGAPIERROR,
|
||
|
"UNICODE_STRING %p, Length %d > MaximumLength %d, %!STATUS!",
|
||
|
String, String->Length, String->MaximumLength, status);
|
||
|
|
||
|
return status;
|
||
|
}
|
||
|
|
||
|
return STATUS_SUCCESS;
|
||
|
}
|
||
|
|
||
|
#endif // _FXVALIDATEFUNCTIONS_H_
|