/*++

Copyright (C) Microsoft Corporation. All rights reserved.

Module Name:

    NFCDTADev.h

Abstract:

    Header file for the NFC DTA device driver interface

--*/

#pragma once

#if (NTDDI_VERSION >= NTDDI_WINTHRESHOLD)

//
// Interface GUIDs
//
#ifdef DEFINE_GUID

// {7fd3f30b-5e49-4be1-b3aa-af06260d236a}
DEFINE_GUID(GUID_DEVINTERFACE_NFCDTA, 0x7fd3f30b, 0x5e49, 0x4be1, 0xb3, 0xaa, 0xaf, 0x06, 0x26, 0x0d, 0x23, 0x6a);

#endif

//
// NFC DTA DDI
//

#define IOCTL_NFCDTA_CONFIG_RF_DISCOVERY \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_RF_DISCOVERY_CONFIG
#define IOCTL_NFCDTA_REMOTE_DEV_GET_NEXT \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0501, METHOD_BUFFERED, FILE_ANY_ACCESS) // Output: NFC_REMOTE_DEV_INFO
#define IOCTL_NFCDTA_REMOTE_DEV_CONNECT \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0502, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_REMOTE_DEV_HANDLE
#define IOCTL_NFCDTA_REMOTE_DEV_DISCONNECT \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0503, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_REMOTE_DEVICE_DISCONNET
#define IOCTL_NFCDTA_REMOTE_DEV_TRANSCEIVE \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0504, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_REMOTE_DEV_SEND_INFO Output: NFC_REMOTE_DEV_RECV_INFO
#define IOCTL_NFCDTA_REMOTE_DEV_RECV \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0505, METHOD_BUFFERED, FILE_ANY_ACCESS) // Output: NFC_REMOTE_DEV_RECV_INFO
#define IOCTL_NFCDTA_REMOTE_DEV_SEND \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0506, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_REMOTE_DEV_SEND_INFO
#define IOCTL_NFCDTA_REMOTE_DEV_CHECK_PRESENCE \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0507, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_REMOTE_DEV_HANDLE
#define IOCTL_NFCDTA_CONFIG_P2P_PARAM \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0508, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_P2P_PARAM_CONFIG
#define IOCTL_NFCDTA_SET_RF_CONFIG \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0509, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: TLV-encoded BYTE array, 1st byte contains number of parameters

//
// NDEF
//
#define IOCTL_NFCDTA_REMOTE_DEV_NDEF_WRITE \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0510, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_REMOTE_DEV_SEND_INFO
#define IOCTL_NFCDTA_REMOTE_DEV_NDEF_READ \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0511, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_REMOTE_DEV_HANDLE Output: NFC_REMOTE_DEV_RECV_INFO
#define IOCTL_NFCDTA_REMOTE_DEV_NDEF_CONVERT_READ_ONLY \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0512, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_REMOTE_DEV_HANDLE
#define IOCTL_NFCDTA_REMOTE_DEV_NDEF_CHECK \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0513, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_REMOTE_DEV_HANDLE Output: NFC_NDEF_INFO

//
// LLCP
//
#define IOCTL_NFCDTA_LLCP_CONFIG CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0520, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_LLCP_CONFIG
#define IOCTL_NFCDTA_LLCP_ACTIVATE \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0521, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_REMOTE_DEV_HANDLE
#define IOCTL_NFCDTA_LLCP_DEACTIVATE \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0522, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_REMOTE_DEV_HANDLE
#define IOCTL_NFCDTA_LLCP_DISCOVER_SERVICES \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0523, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_LLCP_SERVICE_DISCOVER_REQUEST Output: NFC_LLCP_SERVICE_DISCOVER_SAP
#define IOCTL_NFCDTA_LLCP_LINK_STATUS_CHECK \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0524, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_REMOTE_DEV_HANDLE
#define IOCTL_NFCDTA_LLCP_GET_NEXT_LINK_STATUS \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0525, METHOD_BUFFERED, FILE_ANY_ACCESS) // Output: NFC_LLCP_LINK_STATUS
#define IOCTL_NFCDTA_LLCP_SOCKET_CREATE \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0526, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_LLCP_SOCKET_INFO Output: NFC_LLCP_SOCKET_HANDLE
#define IOCTL_NFCDTA_LLCP_SOCKET_CLOSE \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0527, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_LLCP_SOCKET_HANDLE
#define IOCTL_NFCDTA_LLCP_SOCKET_BIND \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0528, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_LLCP_SOCKET_SERVICE_INFO
#define IOCTL_NFCDTA_LLCP_SOCKET_LISTEN \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0529, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_LLCP_SOCKET_HANDLE Output: NFC_LLCP_SOCKET_HANDLE
#define IOCTL_NFCDTA_LLCP_SOCKET_ACCEPT \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x052a, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_LLCP_SOCKET_ACCEPT_INFO
#define IOCTL_NFCDTA_LLCP_SOCKET_CONNECT \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x052b, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_LLCP_SOCKET_CONNECT_INFO
#define IOCTL_NFCDTA_LLCP_SOCKET_DISCONNECT \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x052c, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_LLCP_SOCKET_HANDLE
#define IOCTL_NFCDTA_LLCP_SOCKET_RECV \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x052d, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_LLCP_SOCKET_HANDLE Output: NFC_LLCP_SOCKET_PAYLOAD
#define IOCTL_NFCDTA_LLCP_SOCKET_RECV_FROM \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x052e, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_LLCP_SOCKET_HANDLE Output: NFC_LLCP_SOCKET_PAYLOAD
#define IOCTL_NFCDTA_LLCP_SOCKET_SEND \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x052f, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_LLCP_SOCKET_PAYLOAD
#define IOCTL_NFCDTA_LLCP_SOCKET_SNED_TO \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0530, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_LLCP_SOCKET_CL_PAYLOAD
#define IOCTL_NFCDTA_LLCP_SOCKET_GET_NEXT_ERROR \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0531, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_LLCP_SOCKET_HANDLE Output: NFC_LLCP_SOCKET_ERROR_INFO

//
// SNEP Server
//
#define IOCTL_NFCDTA_SNEP_INIT_SERVER \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0540, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_SNEP_SERVER_INFO Output: NFC_SNEP_SERVER_HANDLE
#define IOCTL_NFCDTA_SNEP_DEINIT_SERVER \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0541, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_SNEP_SERVER_HANDLE
#define IOCTL_NFCDTA_SNEP_SERVER_GET_NEXT_CONNECTION \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0542, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_SNEP_SERVER_HANDLE Output: NFC_SNEP_SERVER_CONNECTION_HANDLE
#define IOCTL_NFCDTA_SNEP_SERVER_ACCEPT \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0543, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_SNEP_SERVER_ACCEPT_INFO
#define IOCTL_NFCDTA_SNEP_SERVER_GET_NEXT_REQUEST \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0544, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_SNEP_SERVER_HANDLE Output: NFC_SNEP_SERVER_REQUEST
#define IOCTL_NFCDTA_SNEP_SERVER_SEND_RESPONSE \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0545, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_SNEP_SERVER_RESPONSE_INFO Output: NFC_SNEP_SERVER_RESPONSE_INFO

//
// SNEP Client
//
#define IOCTL_NFCDTA_SNEP_INIT_CLIENT \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0550, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_SNEP_CLIENT_INFO Output: NFC_SNEP_CLIENT_HANDLE
#define IOCTL_NFCDTA_SNEP_DEINIT_CLIENT \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0551, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_SNEP_CLIENT_HANDLE
#define IOCTL_NFCDTA_SNEP_CLIENT_PUT \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0552, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_SNEP_CLIENT_PUT_INFO
#define IOCTL_NFCDTA_SNEP_CLIENT_GET \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0553, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_SNEP_CLIENT_GET_INFO Output: NFC_SNEP_CLIENT_DATA_BUFFER

//
// SE
//
#define IOCTL_NFCDTA_SE_ENUMERATE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0560, METHOD_BUFFERED, FILE_ANY_ACCESS) // Output: NFC_SE_LIST
#define IOCTL_NFCDTA_SE_SET_EMULATION_MODE \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0561, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_SE_EMULATION_MODE_INFO
#define IOCTL_NFCDTA_SE_SET_ROUTING_TABLE \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0562, METHOD_BUFFERED, FILE_ANY_ACCESS) // Input: NFC_SE_ROUTING_TABLE
#define IOCTL_NFCDTA_SE_GET_NEXT_EVENT \
    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0563, METHOD_BUFFERED, FILE_ANY_ACCESS) // Output: NFC_SE_EVENT_INFO

typedef enum _NFC_RF_DISCOVERY_MODE
{
    RfDiscoveryConfig,
    RfDiscoveryStart,
    RFDiscoveryResume
} NFC_RF_DISCOVERY_MODE,
    *PNFC_RF_DISCOVERY_MODE;

typedef struct _NFC_RF_DISCOVERY_CONFIG
{
    USHORT usTotalDuration;
    ULONG ulPollConfig;
    BOOLEAN fDisableCardEmulation;
    UCHAR ucNfcIPMode;
    BOOLEAN fNfcIPTgtModeDisable;
    UCHAR ucNfcIPTgtMode;
    UCHAR ucNfcCEMode;
    UCHAR ucBailoutConfig;
    UCHAR ucSystemCode[2];
    UCHAR ucRequestCode;
    UCHAR ucTimeSlotNumber;
    NFC_RF_DISCOVERY_MODE eRfDiscoveryMode;
} NFC_RF_DISCOVERY_CONFIG, *PNFC_RF_DISCOVERY_CONFIG;

typedef enum _NFC_P2P_MODE
{
    NfcDepDefault,
    NfcDepPoll,
    NfcDepListen
} NFC_P2P_MODE,
    *PNFC_P2P_MODE;

#define MAX_ATR_LENGTH 48

typedef struct _NFC_P2P_PARAM_CONFIG
{
    NFC_P2P_MODE eP2pMode;
    _Field_range_(<=, MAX_ATR_LENGTH) BYTE cbGeneralBytes;
    _Field_size_bytes_(cbGeneralBytes) BYTE pbGeneralBytes[MAX_ATR_LENGTH];
} NFC_P2P_PARAM_CONFIG, *PNFC_P2P_PARAM_CONFIG;

typedef enum _NFC_DEVICE_TYPE
{
    NfcType1Tag,
    NfcType2Tag,
    NfcType3Tag,
    NfcType4Tag,
    NfcIP1Target,
    NfcIP1Initiator,
    NfcReader
} NFC_DEVICE_TYPE,
    *PNFC_DEVICE_TYPE;

typedef BYTE NFC_RF_TECHNOLOGY;
typedef BYTE NFC_RF_PROTOCOL;

#define MAX_UID_SIZE 16

typedef HANDLE NFC_REMOTE_DEV_HANDLE, *PNFC_REMOTE_DEV_HANDLE;

typedef struct _NFC_REMOTE_DEV_INFO
{
    NFC_REMOTE_DEV_HANDLE hRemoteDev;
    NFC_DEVICE_TYPE eType;
    NFC_RF_TECHNOLOGY eRFTech;
    NFC_RF_PROTOCOL eProtocol;
    _Field_range_(<=, MAX_UID_SIZE) BYTE cbUid;
    _Field_size_bytes_(cbUid) BYTE pbUid[MAX_UID_SIZE];
} NFC_REMOTE_DEV_INFO, *PNFC_REMOTE_DEV_INFO;

typedef enum _NFC_RELEASE_TYPE
{
    IdleMode,
    SleepMode,
    Discovery,
} NFC_RELEASE_TYPE,
    *PNFC_RELEASE_TYPE;

typedef struct _NFC_REMOTE_DEVICE_DISCONNET
{
    NFC_REMOTE_DEV_HANDLE hRemoteDev;
    NFC_RELEASE_TYPE eReleaseType;
} NFC_REMOTE_DEVICE_DISCONNET, *PNFC_REMOTE_DEVICE_DISCONNET;

typedef struct _NFC_DATA_BUFFER
{
    USHORT cbBuffer;
    _Field_size_bytes_(cbBuffer) BYTE pbBuffer[ANYSIZE_ARRAY];
} NFC_DATA_BUFFER, *PNFC_DATA_BUFFER;

typedef struct _NFC_REMOTE_DEV_SEND_INFO
{
    NFC_REMOTE_DEV_HANDLE hRemoteDev;
    USHORT usTimeOut;
    NFC_DATA_BUFFER sSendBuffer;
} NFC_REMOTE_DEV_SEND_INFO, *PNFC_REMOTE_DEV_SEND_INFO;

typedef struct _NFC_REMOTE_DEV_RECV_INFO
{
    NFC_REMOTE_DEV_HANDLE hRemoteDev;
    NFC_DATA_BUFFER sRecvBuffer;
} NFC_REMOTE_DEV_RECV_INFO, *PNFC_REMOTE_DEV_RECV_INFO;

typedef struct _NFC_NDEF_INFO
{
    BOOLEAN fIsNdefFormatted;
    BOOLEAN fIsReadOnly;
    DWORD dwActualMessageLength;
    DWORD dwMaxMessageLength;
} NFC_NDEF_INFO, *PNFC_NDEF_INFO;

typedef struct _LLCP_SOCKET_OPTION
{
    USHORT uMIUX;
    BYTE bRW;
} NFC_LLCP_SOCKET_OPTION, *PNFC_LLCP_SOCKET_OPTION;

#define MAX_LLCP_SERVICE_NAME_SIZE 256

typedef struct _NFC_LLCP_CONFIG
{
    USHORT uMIU;
    USHORT uWKS;
    BYTE bLTO;
    BYTE bOptions;
    BOOLEAN fAutoActivate;
} NFC_LLCP_CONFIG, *PNFC_LLCP_CONFIG;

typedef struct _NFC_LLCP_SERVICE_NAME_ENTRY
{
    _Field_range_(<=, MAX_LLCP_SERVICE_NAME_SIZE) DWORD cbServiceName;
    _Field_size_bytes_(cbServiceName) BYTE pbServiceName[ANYSIZE_ARRAY];
} NFC_LLCP_SERVICE_NAME_ENTRY, *PNFC_LLCP_SERVICE_NAME_ENTRY;

typedef struct _NFC_LLCP_SERVICE_DISCOVER_REQUEST
{
    NFC_REMOTE_DEV_HANDLE hRemoteDev;
    DWORD NumberOfEntries;
    _Field_size_(NumberOfEntries) NFC_LLCP_SERVICE_NAME_ENTRY ServiceNameEntries[ANYSIZE_ARRAY];
} NFC_LLCP_SERVICE_DISCOVER_REQUEST, *PNFC_LLCP_SERVICE_DISCOVER_REQUEST;

typedef struct _NFC_LLCP_SERVICE_DISCOVER_SAP
{
    DWORD NumberOfEntries;
    _Field_size_(NumberOfEntries) BYTE SAPEntries[ANYSIZE_ARRAY];
} NFC_LLCP_SERVICE_DISCOVER_SAP, *PNFC_LLCP_SERVICE_DISCOVER_SAP;

#define NFC_LLCP_SERVICE_DISCOVER_SAP_HEADER offsetof(NFC_LLCP_SERVICE_DISCOVER_SAP, SAPEntries)

typedef enum _NFC_LLCP_SOCKET_TYPE
{
    ConnectionOriented,
    Connectionless,
} NFC_LLCP_SOCKET_TYPE,
    *PNFC_LLCP_SOCKET_TYPE;

typedef enum _NFC_LLCP_LINK_STATUS
{
    LinkActivated,
    LinkDeactivated
} NFC_LLCP_LINK_STATUS,
    *PNFC_LLCP_LINK_STATUS;

typedef HANDLE NFC_LLCP_SOCKET_HANDLE, *PNFC_LLCP_SOCKET_HANDLE;

typedef struct _NFC_LLCP_SOCKET_INFO
{
    NFC_LLCP_SOCKET_TYPE eSocketType;
    NFC_LLCP_SOCKET_OPTION sSocketOption;
} NFC_LLCP_SOCKET_INFO, *PNFC_LLCP_SOCKET_INFO;

typedef struct _NFC_LLCP_SOCKET_SERVICE_INFO
{
    NFC_LLCP_SOCKET_HANDLE hSocket;
    BYTE bSAP;
    NFC_LLCP_SERVICE_NAME_ENTRY sServiceName;
} NFC_LLCP_SOCKET_SERVICE_INFO, *PNFC_LLCP_SOCKET_SERVICE_INFO;

typedef struct _NFC_LLCP_SOCKET_PAYLOAD
{
    NFC_LLCP_SOCKET_HANDLE hSocket;
    BYTE bSAP;
    NFC_DATA_BUFFER sPayload;
} NFC_LLCP_SOCKET_PAYLOAD, *PNFC_LLCP_SOCKET_PAYLOAD;

typedef struct _NFC_LLCP_SOCKET_ACCEPT_INFO
{
    NFC_LLCP_SOCKET_HANDLE hSocket;
    NFC_LLCP_SOCKET_OPTION sSocketOption;
} NFC_LLCP_SOCKET_ACCEPT_INFO, *PNFC_LLCP_SOCKET_ACCEPT_INFO;

typedef enum _NFC_LLCP_SOCKET_CONNECT_TYPE
{
    NfcConnectBySap,
    NfcConnectByUri
} NFC_LLCP_SOCKET_CONNECT_TYPE,
    *PNFC_LLCP_SOCKET_CONNECT_TYPE;

typedef struct _NFC_LLCP_SOCKET_CONNECT_INFO
{
    NFC_REMOTE_DEV_HANDLE hRemoteDev;
    NFC_LLCP_SOCKET_HANDLE hSocket;
    NFC_LLCP_SOCKET_CONNECT_TYPE eConnectType;
    union
    {
        BYTE bSAP;
        NFC_LLCP_SERVICE_NAME_ENTRY sServiceName;
    };
} NFC_LLCP_SOCKET_CONNECT_INFO, *PNFC_LLCP_SOCKET_CONNECT_INFO;

typedef struct _NFC_LLCP_SOCKET_CL_PAYLOAD
{
    NFC_LLCP_SOCKET_HANDLE hSocket;
    BYTE bSAP;
    NFC_DATA_BUFFER sPayload;
} NFC_LLCP_SOCKET_CL_PAYLOAD, *PNFC_LLCP_SOCKET_CL_PAYLOAD;

typedef enum _NFC_LLCP_SOCKET_ERROR
{
    NfcLlcpErrorDisconnected,
    NfcLlcpErrorFrameRejected,
    NfcLlcpErrorBusyCondition,
    NfcLlcpErrorNotBusyCondition,
} NFC_LLCP_SOCKET_ERROR,
    *PNFC_LLCP_SOCKET_ERROR;

typedef struct _NFC_LLCP_SOCKET_ERROR_INFO
{
    NFC_LLCP_SOCKET_HANDLE hSocket;
    NFC_LLCP_SOCKET_ERROR eSocketError;
} NFC_LLCP_SOCKET_ERROR_INFO, *PNFC_LLCP_SOCKET_ERROR_INFO;

typedef enum _NFC_SNEP_SERVER_TYPE
{
    DefaultSnepServer = 0,
    ExtendedSnepServer
} NFC_SNEP_SERVER_TYPE,
    *PNFC_SNEP_SERVER_TYPE;

typedef enum _NFC_SNEP_REQUEST_TYPE
{
    SnepRequestGet = 0,
    SnepRequestPut,
} NFC_SNEP_REQUEST_TYPE,
    *PNFC_SNEP_REQUEST_TYPE;

#define MAX_SNEP_SERVER_NAME_SIZE 256

typedef HANDLE NFC_SNEP_SERVER_HANDLE, *PNFC_SNEP_SERVER_HANDLE;
typedef HANDLE NFC_SNEP_SERVER_CONNECTION_HANDLE, *PNFC_SNEP_SERVER_CONNECTION_HANDLE;
typedef NFC_LLCP_SOCKET_OPTION NFC_SNEP_SOCKET_OPTION, *PNFC_SNEP_SOCKET_OPTION;
typedef struct _NFC_LLCP_SERVICE_NAME_ENTRY NFC_SNEP_SERVICE_NAME, *PNFC_SNEP_SERVICE_NAME;

typedef struct _NFC_SNEP_SERVER_INFO
{
    NFC_SNEP_SERVER_TYPE eServerType;
    NFC_SNEP_SOCKET_OPTION sSocketOption;
    USHORT usInboxSize;
    BYTE bSAP;
    NFC_SNEP_SERVICE_NAME sService;
} NFC_SNEP_SERVER_INFO, *PNFC_SNEP_SERVER_INFO;

typedef struct _NFC_SNEP_SERVER_ACCEPT_INFO
{
    NFC_SNEP_SERVER_HANDLE hSnepServer;
    NFC_SNEP_SERVER_CONNECTION_HANDLE hConnection;
    NFC_SNEP_SOCKET_OPTION sSocketOption;
} NFC_SNEP_SERVER_ACCEPT_INFO, *PNFC_SNEP_SERVER_ACCEPT_INFO;

typedef struct _NFC_SNEP_SERVER_REQUEST
{
    NFC_SNEP_SERVER_HANDLE hSnepServer;
    NFC_SNEP_SERVER_CONNECTION_HANDLE hConnection;
    NFC_SNEP_REQUEST_TYPE eRequestType;
    NFC_DATA_BUFFER sRequestPayload;
} NFC_SNEP_SERVER_REQUEST, *PNFC_SNEP_SERVER_REQUEST;

typedef struct _NFC_SNEP_SERVER_RESPONSE_INFO
{
    NFC_SNEP_SERVER_HANDLE hSnepServer;
    NFC_SNEP_SERVER_CONNECTION_HANDLE hConnection;
    DWORD dwResponseStatus;
    NFC_DATA_BUFFER sResponsePayload;
} NFC_SNEP_SERVER_RESPONSE_INFO, *PNFC_SNEP_SERVER_RESPONSE_INFO;

#define NFC_SNEP_SERVER_RESPONSE_HEADER \
    offsetof(NFC_SNEP_SERVER_RESPONSE_INFO, sResponsePayload) + offsetof(NFC_DATA_BUFFER, pbBuffer)

typedef HANDLE NFC_SNEP_CLIENT_HANDLE, *PNFC_SNEP_CLIENT_HANDLE;
typedef NFC_DATA_BUFFER NFC_SNEP_CLIENT_DATA_BUFFER, *PNFC_SNEP_CLIENT_DATA_BUFFER;

typedef struct _NFC_SNEP_CLIENT_INFO
{
    NFC_REMOTE_DEV_HANDLE hRemoteDev;
    NFC_SNEP_SERVER_TYPE eServerType;
    NFC_SNEP_SOCKET_OPTION sSocketOption;
    NFC_SNEP_SERVICE_NAME sService;
} NFC_SNEP_CLIENT_INFO, *PNFC_SNEP_CLIENT_INFO;

typedef struct _NFC_SNEP_CLIENT_PUT_INFO
{
    NFC_SNEP_CLIENT_HANDLE hSnepClient;
    NFC_DATA_BUFFER sPutPayload;
} NFC_SNEP_CLIENT_PUT_INFO, *PNFC_SNEP_CLIENT_PUT_INFO;

#define NFC_SNEP_CLIENT_PUT_HEADER offsetof(NFC_SNEP_CLIENT_PUT_INFO, sPutPayload) + offsetof(NFC_DATA_BUFFER, pbBuffer)

typedef struct _NFC_SNEP_CLIENT_GET_INFO
{
    NFC_SNEP_CLIENT_HANDLE hSnepClient;
    NFC_DATA_BUFFER sGetPayload;
} NFC_SNEP_CLIENT_GET_INFO, *PNFC_SNEP_CLIENT_GET_INFO;

#define NFC_SNEP_CLIENT_GET_HEADER offsetof(NFC_SNEP_CLIENT_GET_INFO, sGetPayload) + offsetof(NFC_DATA_BUFFER, pbBuffer)

typedef SECURE_ELEMENT_TYPE NFC_SE_TYPE;
typedef HANDLE NFC_SE_HANDLE;
typedef SECURE_ELEMENT_EVENT_TYPE NFC_SE_EVENT_TYPE;

typedef enum _NFC_SE_EMULATION_MODE
{
    EmulationDisabled = 0,
    EmulationEnabled = 1,
} NFC_SE_EMULATION_MODE,
    *PNFC_SE_EMULATION_MODE;

typedef struct _NFC_SE_INFO
{
    NFC_SE_HANDLE hSecureElement;
    NFC_SE_TYPE eSecureElementType;
} NFC_SE_INFO, *PNFC_SE_INFO;

typedef struct _NFC_SE_LIST
{
    DWORD NumberOfEndpoints;
    _Field_size_(NumberOfEndpoints) NFC_SE_INFO EndpointList[ANYSIZE_ARRAY];
} NFC_SE_LIST, *PNFC_SE_LIST;

typedef struct _NFC_SE_EMULATION_MODE_INFO
{
    NFC_SE_HANDLE hSecureElement;
    NFC_SE_EMULATION_MODE eMode;
} NFC_SE_EMULATION_MODE_INFO, *PNFC_SE_EMULATION_MODE_INFO;

typedef SECURE_ELEMENT_ROUTING_TYPE NFC_SE_ROUTING_TABLE_TYPE;

typedef struct _NFC_SE_TECH_ROUTING_INFO
{
    NFC_SE_HANDLE hSecureElement;
    BYTE bPowerState;
    BYTE eRfTechType;
} NFC_SE_TECH_ROUTING_INFO, *PNFC_SE_TECH_ROUTING_INFO;

typedef struct _NFC_SE_PROTO_ROUTING_INFO
{
    NFC_SE_HANDLE hSecureElement;
    BYTE bPowerState;
    BYTE eRfProtocolType;
} NFC_SE_PROTO_ROUTING_INFO, *PNFC_SE_PROTO_ROUTING_INFO;

typedef struct _NFC_SE_AID_ROUTING_INFO
{
    NFC_SE_HANDLE hSecureElement;
    BYTE bPowerState;
    _Field_range_(<=, ISO_7816_MAXIMUM_AID_LENGTH) DWORD cbAid;
    _Field_size_bytes_(cbAid) BYTE pbAid[ISO_7816_MAXIMUM_AID_LENGTH];
} NFC_SE_AID_ROUTING_INFO, *PNFC_SE_AID_ROUTING_INFO;

typedef struct _NFC_SE_ROUTING_TABLE_ENTRY
{
    NFC_SE_ROUTING_TABLE_TYPE eRoutingType;
    union
    {
        NFC_SE_TECH_ROUTING_INFO TechRoutingInfo;
        NFC_SE_PROTO_ROUTING_INFO ProtoRoutingInfo;
        NFC_SE_AID_ROUTING_INFO AidRoutingInfo;
    };
} NFC_SE_ROUTING_TABLE_ENTRY, *PNFC_SE_ROUTING_TABLE_ENTRY;

typedef struct _NFC_SE_ROUTING_TABLE
{
    DWORD NumberOfEntries;
    _Field_size_(NumberOfEntries) NFC_SE_ROUTING_TABLE_ENTRY TableEntries[ANYSIZE_ARRAY];
} NFC_SE_ROUTING_TABLE, *PNFC_SE_ROUTING_TABLE;

#define NFC_SE_ROUTING_TABLE_AND_ENTRIES(n) \
    struct \
    { \
        NFC_SE_ROUTING_TABLE Table; \
        NFC_SE_ROUTING_TABLE_ENTRY ExtraEntries[n - 1]; \
    }

typedef struct _NFC_SE_EVENT_INFO
{
    NFC_SE_HANDLE hSecureElement;
    NFC_SE_EVENT_TYPE eEventType;
    DWORD cbEventData;
    _Field_size_bytes_(cbEventData) BYTE pbEventData[ANYSIZE_ARRAY];
} NFC_SE_EVENT_INFO, *PNFC_SE_EVENT_INFO;

#endif // NTDDI_VERSION
