/*++

Copyright (c) 2020 Microsoft Corporation

Module Name:

    prminterface.h

Abstract:

    This file contains the interfaces required for PRM support.

Author:

    Yinghan Yang (yinghany) 18-Feb-2020

Environment:

    Kernel Mode

Revision History:

--*/


#pragma once

#pragma warning( push )
#pragma warning( disable : 4115 ) /* nonstandard extension used : named type definition in parens */
#pragma warning( disable : 4201 ) /* nonstandard extension used : nameless struct/union */
#pragma warning( disable : 4214 ) /* nonstandard extension used : bit field types other then int */

typedef
_Function_class_(PRM_HANDLER_ROUTINE)
NTSTATUS
PRM_HANDLER_ROUTINE (
    _In_ PVOID ParameterBuffer,
    _In_ PVOID ContextBuffer
    );

typedef PRM_HANDLER_ROUTINE *PPRM_HANDLER_ROUTINE;

typedef
_Function_class_(PRM_INVOKE_HANDLER)
_IRQL_requires_max_(HIGH_LEVEL)
NTSTATUS
PRM_INVOKE_HANDLER (
    _In_ LPGUID HandlerGuid,
    _In_ PVOID ParameterBuffer,
    _In_ ULONG Reserved,
    _Out_ PULONG64 EfiStatus
    );

typedef PRM_INVOKE_HANDLER *PPRM_INVOKE_HANDLER;

typedef
_Function_class_(PRM_QUERY_HANDLER)
_IRQL_requires_max_(HIGH_LEVEL)
NTSTATUS
PRM_QUERY_HANDLER (
    _In_ LPGUID HandlerGuid,
    _Out_ PBOOLEAN Found
    );

typedef PRM_QUERY_HANDLER *PPRM_QUERY_HANDLER;

typedef
_Function_class_(PRM_LOCK_MODULE)
_IRQL_requires_max_(HIGH_LEVEL)
NTSTATUS
PRM_LOCK_MODULE (
    _In_ LPGUID HandlerGuid
    );

typedef PRM_LOCK_MODULE *PPRM_LOCK_MODULE;

typedef
_Function_class_(PRM_UNLOCK_MODULE)
_IRQL_requires_max_(HIGH_LEVEL)
NTSTATUS
PRM_UNLOCK_MODULE (
    _In_ LPGUID HandlerGuid
    );

typedef PRM_UNLOCK_MODULE *PPRM_UNLOCK_MODULE;

typedef struct _PRM_DRIVER_INTERFACE_STANDARD {

    //
    // Generic interface header
    //

     USHORT Size;
     USHORT Version;
     PVOID Context;
     PINTERFACE_REFERENCE    InterfaceReference;
     PINTERFACE_DEREFERENCE  InterfaceDereference;
     PPRM_INVOKE_HANDLER InvokeHandler;
     PPRM_QUERY_HANDLER QueryHandler;
     PPRM_LOCK_MODULE LockModule;
     PPRM_UNLOCK_MODULE UnlockModule;

} PRM_DRIVER_INTERFACE_STANDARD, *PPRM_DRIVER_INTERFACE_STANDARD;

// {d37ca3d8-07cd-450d-8893-1d292112405e}
DEFINE_GUID(
    GUID_PRM_DEVICE,
    0xd37ca3d8, 0x07cd, 0x450d, 0x88, 0x93, 0x1d, 0x29, 0x21, 0x12, 0x40, 0x5e);

#define PRM_INTERFACE_STANDARD_VERSION 0x1

// {0d8ac963-4e72-4889-80c1-abc86d909af0}
DEFINE_GUID(
    GUID_PRM_DRIVER_INTERFACE_STANDARD,
    0x0d8ac963, 0x4e72, 0x4889, 0x80, 0xc1, 0xab, 0xc8, 0x6d, 0x90, 0x9a, 0xf0);


typedef struct _PRM_INTERFACE {
    ULONG Version;
    PPRM_UNLOCK_MODULE UnlockModule;
    PPRM_LOCK_MODULE LockModule;
    PPRM_INVOKE_HANDLER InvokeHandler;
    PPRM_QUERY_HANDLER  QueryHandler;
} PRM_INTERFACE, *PPRM_INTERFACE;

_Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)
_IRQL_requires_same_
NTKERNELAPI
NTSTATUS
ExGetPrmInterface (
    _In_ ULONG Version,
    _Out_ PPRM_INTERFACE InterfaceOut
    );

#define PRM_INTERFACE_V1 1

#pragma warning( pop )
