/*
 * PROJECT:     Kernel Mode Device Framework
 * LICENSE:     GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
 * PURPOSE:     Missing headers (wdfcx.h)
 * COPYRIGHT:   2020 Victor Perevertkin (victor.perevertkin@reactos.org)
 */

#ifndef _WDFCX_H_
#define _WDFCX_H_

typedef BOOLEAN
(STDCALL *PFN_WDFCX_DEVICE_FILE_CREATE) (
    _In_ WDFDEVICE Device,
    _In_ WDFREQUEST Request,
    _In_opt_ WDFFILEOBJECT FileObject);

// _WDFCX_FILEOBJECT_CONFIG_V1_17

typedef struct _WDFCX_FILEOBJECT_CONFIG {
    //
    // Size of this structure in bytes
    //
    ULONG Size;

    //
    // Event callback for create requests
    //
    PFN_WDFCX_DEVICE_FILE_CREATE  EvtCxDeviceFileCreate;

    //
    // Event callback for close requests
    //
    PFN_WDF_FILE_CLOSE   EvtFileClose;

    //
    // Event callback for cleanup requests
    //
    PFN_WDF_FILE_CLEANUP EvtFileCleanup;

    //
    // If WdfTrue, create/cleanup/close file object related requests will be
    // sent down the stack.
    //
    // If WdfFalse, create/cleanup/close will be completed at this location in
    // the device stack.
    //
    // If WdfDefault, behavior depends on device type
    // FDO, PDO, Control:  use the WdfFalse behavior
    // Filter:  use the WdfTrue behavior
    //
    WDF_TRI_STATE AutoForwardCleanupClose;

    //
    // Specify whether framework should create WDFFILEOBJECT and also
    // whether it can FsContexts fields in the WDM fileobject to store
    // WDFFILEOBJECT so that it can avoid table look up and improve perf.
    //
    WDF_FILEOBJECT_CLASS FileObjectClass;

} WDFCX_FILEOBJECT_CONFIG, *PWDFCX_FILEOBJECT_CONFIG;

typedef NTSTATUS
(STDCALL *PFN_WDFCXDEVICE_WDM_IRP_PREPROCESS)(
    _In_ WDFDEVICE Device,
    _Inout_ PIRP Irp,
    _In_ PVOID DispatchContext);

typedef PWDFCXDEVICE_INIT
(STDCALL *PFN_WDFCXDEVICEINITALLOCATE)(
    _In_ PWDF_DRIVER_GLOBALS DriverGlobals,
    _In_ PWDFDEVICE_INIT DeviceInit);

typedef NTSTATUS
(STDCALL *PFN_WDFCXDEVICEINITASSIGNWDMIRPPREPROCESSCALLBACK) (
    _In_ PWDF_DRIVER_GLOBALS DriverGlobals,
    _In_ PWDFCXDEVICE_INIT CxDeviceInit,
    _In_ PFN_WDFCXDEVICE_WDM_IRP_PREPROCESS EvtCxDeviceWdmIrpPreprocess,
    _In_ UCHAR MajorFunction,
    _When_(NumMinorFunctions > 0, _In_reads_bytes_(NumMinorFunctions))
    _When_(NumMinorFunctions == 0, _In_opt_)
    PUCHAR MinorFunctions,
    _In_ ULONG NumMinorFunctions);

typedef VOID
(STDCALL *PFN_WDFCXDEVICEINITSETIOINCALLERCONTEXTCALLBACK)(
    _In_ PWDF_DRIVER_GLOBALS DriverGlobals,
    _In_ PWDFCXDEVICE_INIT CxDeviceInit,
    _In_ PFN_WDF_IO_IN_CALLER_CONTEXT EvtIoInCallerContext);

typedef VOID
(STDCALL *PFN_WDFCXDEVICEINITSETREQUESTATTRIBUTES)(
    _In_ PWDF_DRIVER_GLOBALS DriverGlobals,
    _In_ PWDFCXDEVICE_INIT CxDeviceInit,
    _In_ PWDF_OBJECT_ATTRIBUTES RequestAttributes);

typedef VOID
(STDCALL *PFN_WDFCXDEVICEINITSETFILEOBJECTCONFIG)(
    _In_ PWDF_DRIVER_GLOBALS DriverGlobals,
    _In_ PWDFCXDEVICE_INIT CxDeviceInit,
    _In_ PWDFCX_FILEOBJECT_CONFIG CxFileObjectConfig,
    _In_opt_ PWDF_OBJECT_ATTRIBUTES FileObjectAttributes);

typedef VOID
(STDCALL *PFN_WDFCXVERIFIERKEBUGCHECK)(
    _In_ PWDF_DRIVER_GLOBALS DriverGlobals,
    _In_opt_ WDFOBJECT Object,
    _In_ ULONG BugCheckCode,
    _In_ ULONG_PTR BugCheckParameter1,
    _In_ ULONG_PTR BugCheckParameter2,
    _In_ ULONG_PTR BugCheckParameter3,
    _In_ ULONG_PTR BugCheckParameter4);

typedef WDFIOTARGET
(STDCALL *PFN_WDFDEVICEGETSELFIOTARGET)(
    _In_ PWDF_DRIVER_GLOBALS DriverGlobals,
    _In_ WDFDEVICE Device);

typedef VOID
(STDCALL *PFN_WDFDEVICEINITALLOWSELFIOTARGET)(
    _In_ PWDF_DRIVER_GLOBALS DriverGlobals,
    _In_ PWDFDEVICE_INIT DeviceInit);

typedef NTSTATUS
(STDCALL *PFN_WDFIOTARGETSELFASSIGNDEFAULTIOQUEUE)(
    _In_ PWDF_DRIVER_GLOBALS DriverGlobals,
    _In_ WDFIOTARGET IoTarget,
    _In_ WDFQUEUE Queue);

// some other random stuff

typedef PVOID PFN_WDF_CLASS_EXTENSIONIN_BIND;
typedef PVOID PFN_WDF_CLASS_EXTENSIONIN_UNBIND;
typedef PVOID PFN_WDF_CLASS_EXPORT;
typedef PVOID PFN_WDF_CLASS_LIBRARY_INITIALIZE;
typedef PVOID PFN_WDF_CLASS_LIBRARY_DEINITIALIZE;
typedef PVOID PFN_WDF_CLASS_LIBRARY_BIND_CLIENT;
typedef PVOID PFN_WDF_CLASS_LIBRARY_UNBIND_CLIENT;
typedef PVOID PFN_WDF_CLIENT_BIND_CLASS;
typedef PVOID PFN_WDF_CLIENT_UNBIND_CLASS;

#endif // _WDFCX_H_