summaryrefslogtreecommitdiff
path: root/gnss/gnssUmdf/Queue.h
blob: 89a105ac8bed4243689cff02e98b2c7f740eef60 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/*++

Copyright (c) Microsoft Corporation.  All rights reserved.

Module Name:

    queue.h

Abstract:

    This file contains the queue definitions for the Umdf Gnss Driver.

Environment:

    Windows User-Mode Driver Framework

--*/

#pragma once

class CFixHandler;

//
//This class sets up IO queue, performs the IOCTL operations, and implements the type definitions for the driver's device callback.
//
class CQueue
{
public:
    static NTSTATUS AddQueueToDevice(_In_ WDFDEVICE device, _Outptr_ CQueue** queue);

private:
    enum
    {
        AGNSS_TIME_IDX = GNSS_AGNSS_TimeInjection,
        AGNSS_POS_IDX = GNSS_AGNSS_PositionInjection,
        AGNSS_BLOB_IDX = GNSS_AGNSS_BlobInjection,
        AGNSS_MAX_IDX
    };

    typedef struct {
        DWORD OperationMode;
        BOOL SetLocationNiRequestAllowed;
        BOOL SetLocationServiceEnabled;
    } GnssInternalState;

    WDFQUEUE _Queue;
    CRITICAL_SECTION _Lock;
    CFixHandler _FixHandler;
    ULONG _ForcedDriverVersion = GNSS_DRIVER_DDK_VERSION;
    GnssInternalState _InternalState = {};
    BOOL _AgnssNeeded[AGNSS_MAX_IDX];
    
    CQueue(WDFQUEUE Queue);
    ~CQueue();

    static EVT_WDF_OBJECT_CONTEXT_CLEANUP OnCleanup;
    static EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL OnIoDeviceControl;

    template <class DataT>
    BOOL GetDataFromCommand(_In_ PGNSS_DRIVERCOMMAND_PARAM Command,
                            _Out_ DataT* Data);

    NTSTATUS Initialize();
    void OnIoDeviceControl(_In_ WDFREQUEST Request,
                           _In_ ULONG IoControlCode,
                           _In_ size_t InputBufferLength,
                           _In_ size_t OutputBufferLength);
    NTSTATUS GetDeviceCapability(_In_ WDFREQUEST Request);
    NTSTATUS GetChipsetInfo(_In_ WDFREQUEST Request);
    NTSTATUS HandleDriverCommand(_In_ WDFREQUEST Request);
    
    NTSTATUS ResetEngine(_In_ PGNSS_DRIVERCOMMAND_PARAM CommandParam);
    NTSTATUS ClearAgnssData(_In_ PGNSS_DRIVERCOMMAND_PARAM CommandParam);
    NTSTATUS SetLocationServiceStatus(_In_ PGNSS_DRIVERCOMMAND_PARAM CommandParam);
    NTSTATUS SetOperationMode(_In_ PGNSS_DRIVERCOMMAND_PARAM CommandParam);
};

WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(CQueue, GetQueueObject);