997 lines
20 KiB
C
997 lines
20 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
61883.h
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
The public header for clients of the 61883 Class.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
WGJ
|
||
|
PSB
|
||
|
|
||
|
--*/
|
||
|
|
||
|
//
|
||
|
// Class GUID
|
||
|
//
|
||
|
// {7EBEFBC0-3200-11d2-B4C2-00A0C9697D07}
|
||
|
DEFINE_GUID(GUID_61883_CLASS, 0x7ebefbc0, 0x3200, 0x11d2, 0xb4, 0xc2, 0x0, 0xa0, 0xc9, 0x69, 0x7d, 0x7);
|
||
|
|
||
|
//
|
||
|
// IOCTL Definitions
|
||
|
//
|
||
|
#define IOCTL_61883_CLASS CTL_CODE( \
|
||
|
FILE_DEVICE_UNKNOWN, \
|
||
|
0x91, \
|
||
|
METHOD_IN_DIRECT, \
|
||
|
FILE_ANY_ACCESS \
|
||
|
)
|
||
|
|
||
|
|
||
|
//
|
||
|
// Current 61883 DDI Version
|
||
|
//
|
||
|
#define CURRENT_61883_DDI_VERSION 0x2
|
||
|
|
||
|
//
|
||
|
// INIT_61883_HEADER Macro
|
||
|
//
|
||
|
#define INIT_61883_HEADER( Av61883, Request ) \
|
||
|
(Av61883)->Function = Request; \
|
||
|
(Av61883)->Version = CURRENT_61883_DDI_VERSION;
|
||
|
|
||
|
//
|
||
|
// 61883 I/O Request Functions
|
||
|
//
|
||
|
enum {
|
||
|
|
||
|
Av61883_GetUnitInfo,
|
||
|
Av61883_SetUnitInfo,
|
||
|
|
||
|
Av61883_SetPlug,
|
||
|
Av61883_GetPlugHandle,
|
||
|
Av61883_GetPlugState,
|
||
|
Av61883_Connect,
|
||
|
Av61883_Disconnect,
|
||
|
|
||
|
Av61883_AttachFrame,
|
||
|
Av61883_CancelFrame,
|
||
|
Av61883_Talk,
|
||
|
Av61883_Listen,
|
||
|
Av61883_Stop,
|
||
|
|
||
|
Av61883_SendFcpRequest,
|
||
|
Av61883_GetFcpResponse,
|
||
|
|
||
|
Av61883_GetFcpRequest,
|
||
|
Av61883_SendFcpResponse,
|
||
|
|
||
|
Av61883_SetFcpNotify,
|
||
|
|
||
|
Av61883_CreatePlug,
|
||
|
Av61883_DeletePlug,
|
||
|
|
||
|
Av61883_BusResetNotify,
|
||
|
Av61883_BusReset,
|
||
|
|
||
|
Av61883_SetUnitDirectory,
|
||
|
|
||
|
Av61883_MonitorPlugs,
|
||
|
|
||
|
Av61883_MAX
|
||
|
};
|
||
|
|
||
|
//
|
||
|
// Plug States
|
||
|
//
|
||
|
#define CMP_PLUG_STATE_IDLE 0
|
||
|
#define CMP_PLUG_STATE_READY 1
|
||
|
#define CMP_PLUG_STATE_SUSPENDED 2
|
||
|
#define CMP_PLUG_STATE_ACTIVE 3
|
||
|
|
||
|
//
|
||
|
// Connect Speeds (not the same as 1394 speed flags!!)
|
||
|
//
|
||
|
#define CMP_SPEED_S100 0x00
|
||
|
#define CMP_SPEED_S200 0x01
|
||
|
#define CMP_SPEED_S400 0x02
|
||
|
|
||
|
//
|
||
|
// CIP Frame Flags
|
||
|
//
|
||
|
#define CIP_VALIDATE_FIRST_SOURCE 0x00000001
|
||
|
#define CIP_VALIDATE_ALL_SOURCE 0x00000002
|
||
|
#define CIP_STRIP_SOURCE_HEADER 0x00000004
|
||
|
#define CIP_USE_SOURCE_HEADER_TIMESTAMP 0x00000008
|
||
|
#define CIP_DV_STYLE_SYT 0x00000010
|
||
|
#define CIP_AUDIO_STYLE_SYT 0x00000020
|
||
|
#define CIP_RESET_FRAME_ON_DISCONTINUITY 0x00000040
|
||
|
|
||
|
//
|
||
|
// CIP Status Codes
|
||
|
//
|
||
|
#define CIP_STATUS_SUCCESS 0x00000000
|
||
|
#define CIP_STATUS_CORRUPT_FRAME 0x00000001
|
||
|
#define CIP_STATUS_FIRST_FRAME 0x00000002
|
||
|
|
||
|
//
|
||
|
// CIP Talk Flags
|
||
|
//
|
||
|
#define CIP_TALK_USE_SPH_TIMESTAMP 0x00000001
|
||
|
#define CIP_TALK_DOUBLE_BUFFER 0x00000002
|
||
|
|
||
|
//
|
||
|
// Plug Location
|
||
|
//
|
||
|
typedef enum {
|
||
|
CMP_PlugLocal = 0,
|
||
|
CMP_PlugRemote
|
||
|
} CMP_PLUG_LOCATION;
|
||
|
|
||
|
//
|
||
|
// Plug Type
|
||
|
//
|
||
|
typedef enum {
|
||
|
CMP_PlugOut = 0, // oPCR
|
||
|
CMP_PlugIn // iPCR
|
||
|
} CMP_PLUG_TYPE;
|
||
|
|
||
|
//
|
||
|
// Connect Type
|
||
|
//
|
||
|
typedef enum {
|
||
|
CMP_Broadcast = 0,
|
||
|
CMP_PointToPoint
|
||
|
} CMP_CONNECT_TYPE;
|
||
|
|
||
|
typedef struct _OPCR {
|
||
|
ULONG Payload:10;
|
||
|
ULONG OverheadID:4;
|
||
|
ULONG DataRate:2;
|
||
|
ULONG Channel:6;
|
||
|
ULONG Reserved:2;
|
||
|
ULONG PPCCounter:6;
|
||
|
ULONG BCCCounter:1;
|
||
|
ULONG OnLine:1;
|
||
|
} OPCR, *POPCR;
|
||
|
|
||
|
typedef struct _IPCR {
|
||
|
ULONG Reserved0:16;
|
||
|
ULONG Channel:6;
|
||
|
ULONG Reserved1:2;
|
||
|
ULONG PPCCounter:6;
|
||
|
ULONG BCCCounter:1;
|
||
|
ULONG OnLine:1;
|
||
|
} IPCR, *PIPCR;
|
||
|
|
||
|
typedef struct _AV_PCR {
|
||
|
union {
|
||
|
OPCR oPCR;
|
||
|
IPCR iPCR;
|
||
|
ULONG ulongData;
|
||
|
};
|
||
|
} AV_PCR, *PAV_PCR;
|
||
|
|
||
|
//
|
||
|
// Client Request Structures
|
||
|
//
|
||
|
|
||
|
//
|
||
|
// Local or Device Unit Info
|
||
|
//
|
||
|
#define RETRIEVE_DEVICE_UNIT_INFO 0x00000000 // Retrieve Info from Device
|
||
|
#define RETRIEVE_LOCAL_UNIT_INFO 0x00000001 // Retrieve Info from Local Node
|
||
|
|
||
|
//
|
||
|
// DiagLevel's used for controlling various behavior
|
||
|
//
|
||
|
#define DIAGLEVEL_NONE 0x00000000 // Nothing.
|
||
|
#define DIAGLEVEL_IGNORE_OPLUG 0x00000001 // Will not program the oPCR
|
||
|
#define DIAGLEVEL_IGNORE_IPLUG 0x00000002 // Will not program the iPCR
|
||
|
#define DIAGLEVEL_SET_CHANNEL_63 0x00000004 // Resets channel to 63 when oPCR/iPCR is disconnected
|
||
|
#define DIAGLEVEL_IPCR_IGNORE_FREE 0x00000008 // Will not free isoch resources when iPCR is disconnected
|
||
|
// and local oPCR is not specified
|
||
|
#define DIAGLEVEL_HIDE_OPLUG 0x00000010 // Hides the oMPR & oPCR in an exclusive address range
|
||
|
#define DIAGLEVEL_IPCR_ALWAYS_ALLOC 0x00000020 // Will always allocate when connecting to iPCR with no
|
||
|
// oPCR specified, regardless if iPCR has existing connection
|
||
|
#define DIAGLEVEL_SPECIFY_BLOCKSIZE 0x00000040 // This flag is specified when we detect an invalid max_rec or
|
||
|
// want to specify the block size. If this flag is set, all async
|
||
|
// transactions will be transmitted upto 512 byte blocks (S100)
|
||
|
|
||
|
//
|
||
|
// GetUnitInfo nLevel's
|
||
|
//
|
||
|
#define GET_UNIT_INFO_IDS 0x00000001 // Retrieves IDs of Unit
|
||
|
#define GET_UNIT_INFO_CAPABILITIES 0x00000002 // Retrieves Capabilities of Unit
|
||
|
#define GET_UNIT_INFO_ISOCH_PARAMS 0x00000003 // Retrieves parameters for isoch
|
||
|
#define GET_UNIT_BUS_GENERATION_NODE 0x00000004 // Retrieves current generation/node
|
||
|
#define GET_UNIT_DDI_VERSION 0x00000005 // Retrieves 61883 DDI Version
|
||
|
#define GET_UNIT_DIAG_LEVEL 0x00000006 // Retrieves the currently set DiagLevel flags
|
||
|
|
||
|
//
|
||
|
// Hardware Flags
|
||
|
//
|
||
|
#define AV_HOST_DMA_DOUBLE_BUFFERING_ENABLED 0x00000001
|
||
|
|
||
|
typedef struct _GET_UNIT_IDS {
|
||
|
|
||
|
//
|
||
|
// UniqueID
|
||
|
//
|
||
|
OUT LARGE_INTEGER UniqueID;
|
||
|
|
||
|
//
|
||
|
// VendorID
|
||
|
//
|
||
|
OUT ULONG VendorID;
|
||
|
|
||
|
//
|
||
|
// ModelID
|
||
|
//
|
||
|
OUT ULONG ModelID;
|
||
|
|
||
|
//
|
||
|
// VendorText Length
|
||
|
//
|
||
|
OUT ULONG ulVendorLength;
|
||
|
|
||
|
//
|
||
|
// VendorText String
|
||
|
//
|
||
|
OUT PWSTR VendorText;
|
||
|
|
||
|
//
|
||
|
// ModelText Length
|
||
|
//
|
||
|
OUT ULONG ulModelLength;
|
||
|
|
||
|
//
|
||
|
// ModelText String
|
||
|
//
|
||
|
OUT PWSTR ModelText;
|
||
|
|
||
|
//
|
||
|
// UnitModelID
|
||
|
//
|
||
|
OUT ULONG UnitModelID;
|
||
|
|
||
|
//
|
||
|
// UnitModelText Length
|
||
|
//
|
||
|
OUT ULONG ulUnitModelLength;
|
||
|
|
||
|
//
|
||
|
// UnitModelText String
|
||
|
//
|
||
|
OUT PWSTR UnitModelText;
|
||
|
|
||
|
} GET_UNIT_IDS, *PGET_UNIT_IDS;
|
||
|
|
||
|
typedef struct _GET_UNIT_CAPABILITIES {
|
||
|
|
||
|
//
|
||
|
// Number of Output Plugs supported by device
|
||
|
//
|
||
|
OUT ULONG NumOutputPlugs;
|
||
|
|
||
|
//
|
||
|
// Number of Input Plugs supported by device
|
||
|
//
|
||
|
OUT ULONG NumInputPlugs;
|
||
|
|
||
|
//
|
||
|
// MaxDataRate
|
||
|
//
|
||
|
OUT ULONG MaxDataRate;
|
||
|
|
||
|
//
|
||
|
// CTS Flags
|
||
|
//
|
||
|
OUT ULONG CTSFlags;
|
||
|
|
||
|
//
|
||
|
// Hardware Flags
|
||
|
//
|
||
|
OUT ULONG HardwareFlags;
|
||
|
|
||
|
} GET_UNIT_CAPABILITIES, *PGET_UNIT_CAPABILITIES;
|
||
|
|
||
|
//
|
||
|
// UnitIsochParams
|
||
|
//
|
||
|
typedef struct _UNIT_ISOCH_PARAMS {
|
||
|
|
||
|
IN OUT ULONG RX_NumPackets;
|
||
|
|
||
|
IN OUT ULONG RX_NumDescriptors;
|
||
|
|
||
|
IN OUT ULONG TX_NumPackets;
|
||
|
|
||
|
IN OUT ULONG TX_NumDescriptors;
|
||
|
|
||
|
} UNIT_ISOCH_PARAMS, *PUNIT_ISOCH_PARAMS;
|
||
|
|
||
|
//
|
||
|
// Unit Generation/Node Info
|
||
|
//
|
||
|
typedef struct _BUS_GENERATION_NODE {
|
||
|
|
||
|
OUT ULONG GenerationCount;
|
||
|
|
||
|
OUT NODE_ADDRESS LocalNodeAddress;
|
||
|
|
||
|
OUT NODE_ADDRESS DeviceNodeAddress;
|
||
|
|
||
|
} BUS_GENERATION_NODE, *PBUS_GENERATION_NODE;
|
||
|
|
||
|
//
|
||
|
// Unit DDI Version
|
||
|
//
|
||
|
typedef struct _UNIT_DDI_VERSION {
|
||
|
|
||
|
OUT ULONG Version;
|
||
|
|
||
|
} UNIT_DDI_VERSION, *PUNIT_DDI_VERSION;
|
||
|
|
||
|
//
|
||
|
// UnitDiagLevel
|
||
|
//
|
||
|
typedef struct _UNIT_DIAG_LEVEL {
|
||
|
|
||
|
IN ULONG DiagLevel;
|
||
|
|
||
|
} UNIT_DIAG_LEVEL, *PUNIT_DIAG_LEVEL;
|
||
|
|
||
|
//
|
||
|
// GetUnitInfo
|
||
|
//
|
||
|
typedef struct _GET_UNIT_INFO {
|
||
|
|
||
|
IN ULONG nLevel;
|
||
|
|
||
|
IN OUT PVOID Information;
|
||
|
|
||
|
} GET_UNIT_INFO, *PGET_UNIT_INFO;
|
||
|
|
||
|
//
|
||
|
// SetUnitInfo nLevel's
|
||
|
//
|
||
|
#define SET_UNIT_INFO_DIAG_LEVEL 0x00000001 // Sets the diag level for 61883
|
||
|
#define SET_UNIT_INFO_ISOCH_PARAMS 0x00000002 // Sets the parameters for isoch
|
||
|
#define SET_CMP_ADDRESS_RANGE_TYPE 0x00000003 // Sets the type of CMP address range
|
||
|
|
||
|
//
|
||
|
// CMP Address Range Type
|
||
|
//
|
||
|
#define CMP_ADDRESS_TYPE_GLOBAL 0x00000001 // Global CMP for this instance - default
|
||
|
#define CMP_ADDRESS_TYPE_EXCLUSIVE 0x00000002 // Exclusive CMP for this instance
|
||
|
|
||
|
//
|
||
|
// SetCmpAddressRange
|
||
|
//
|
||
|
typedef struct _SET_CMP_ADDRESS_TYPE {
|
||
|
|
||
|
IN ULONG Type;
|
||
|
|
||
|
} SET_CMP_ADDRESS_TYPE, *PSET_CMP_ADDRESS_TYPE;
|
||
|
|
||
|
//
|
||
|
// SetUnitInfo
|
||
|
//
|
||
|
typedef struct _SET_UNIT_INFO {
|
||
|
|
||
|
IN ULONG nLevel;
|
||
|
|
||
|
IN OUT PVOID Information;
|
||
|
|
||
|
} SET_UNIT_INFO, *PSET_UNIT_INFO;
|
||
|
|
||
|
//
|
||
|
// GetPlugHandle
|
||
|
//
|
||
|
typedef struct _CMP_GET_PLUG_HANDLE {
|
||
|
|
||
|
//
|
||
|
// Requested Plug Number
|
||
|
//
|
||
|
IN ULONG PlugNum;
|
||
|
|
||
|
//
|
||
|
// Requested Plug Type
|
||
|
//
|
||
|
IN CMP_PLUG_TYPE Type;
|
||
|
|
||
|
//
|
||
|
// Returned Plug Handle
|
||
|
//
|
||
|
OUT HANDLE hPlug;
|
||
|
|
||
|
} CMP_GET_PLUG_HANDLE, *PCMP_GET_PLUG_HANDLE;
|
||
|
|
||
|
//
|
||
|
// GetPlugState
|
||
|
//
|
||
|
typedef struct _CMP_GET_PLUG_STATE {
|
||
|
|
||
|
//
|
||
|
// Plug Handle
|
||
|
//
|
||
|
IN HANDLE hPlug;
|
||
|
|
||
|
//
|
||
|
// Current State
|
||
|
//
|
||
|
OUT ULONG State;
|
||
|
|
||
|
//
|
||
|
// Current Data Rate
|
||
|
//
|
||
|
OUT ULONG DataRate;
|
||
|
|
||
|
//
|
||
|
// Current Payload Size
|
||
|
//
|
||
|
OUT ULONG Payload;
|
||
|
|
||
|
//
|
||
|
// Number of Broadcast Connections
|
||
|
//
|
||
|
OUT ULONG BC_Connections;
|
||
|
|
||
|
//
|
||
|
// Number of Point to Point Connections
|
||
|
//
|
||
|
OUT ULONG PP_Connections;
|
||
|
|
||
|
} CMP_GET_PLUG_STATE, *PCMP_GET_PLUG_STATE;
|
||
|
|
||
|
//
|
||
|
// CipDataFormat
|
||
|
//
|
||
|
typedef struct _CIP_DATA_FORMAT {
|
||
|
|
||
|
//
|
||
|
// FMT and FDF either known, or discovered
|
||
|
// via AV/C command
|
||
|
//
|
||
|
UCHAR FMT;
|
||
|
UCHAR FDF_hi;
|
||
|
UCHAR FDF_mid;
|
||
|
UCHAR FDF_lo;
|
||
|
|
||
|
//
|
||
|
// SPH as defined by IEC-61883
|
||
|
//
|
||
|
BOOLEAN bHeader;
|
||
|
|
||
|
//
|
||
|
// QPC as defined by IEC-61883
|
||
|
//
|
||
|
UCHAR Padding;
|
||
|
|
||
|
//
|
||
|
// DBS as defined by IEC-61883
|
||
|
//
|
||
|
UCHAR BlockSize;
|
||
|
|
||
|
//
|
||
|
// FN as defined by IEC-61883
|
||
|
//
|
||
|
UCHAR Fraction;
|
||
|
|
||
|
//
|
||
|
// BlockPeriod - TX Only
|
||
|
//
|
||
|
ULONG BlockPeriod;
|
||
|
|
||
|
} CIP_DATA_FORMAT, *PCIP_DATA_FORMAT;
|
||
|
|
||
|
//
|
||
|
// Connect
|
||
|
//
|
||
|
typedef struct _CMP_CONNECT {
|
||
|
|
||
|
//
|
||
|
// Output Plug Handle
|
||
|
//
|
||
|
IN HANDLE hOutputPlug;
|
||
|
|
||
|
//
|
||
|
// Input Plug Handle
|
||
|
//
|
||
|
IN HANDLE hInputPlug;
|
||
|
|
||
|
//
|
||
|
// Requested Connect Type
|
||
|
//
|
||
|
IN CMP_CONNECT_TYPE Type;
|
||
|
|
||
|
//
|
||
|
// Requested Data Format - TX Only
|
||
|
//
|
||
|
IN CIP_DATA_FORMAT Format;
|
||
|
|
||
|
//
|
||
|
// Returned Connect Handle
|
||
|
//
|
||
|
OUT HANDLE hConnect;
|
||
|
|
||
|
} CMP_CONNECT, *PCMP_CONNECT;
|
||
|
|
||
|
//
|
||
|
// Disconnect
|
||
|
//
|
||
|
typedef struct _CMP_DISCONNECT {
|
||
|
|
||
|
//
|
||
|
// Connect Handle to Disconnect
|
||
|
//
|
||
|
IN HANDLE hConnect;
|
||
|
|
||
|
} CMP_DISCONNECT, *PCMP_DISCONNECT;
|
||
|
|
||
|
//
|
||
|
// CIP Frame typedef
|
||
|
//
|
||
|
typedef struct _CIP_FRAME CIP_FRAME, *PCIP_FRAME;
|
||
|
|
||
|
//
|
||
|
// ValidateInfo Struct. returned on pfnValidate.
|
||
|
//
|
||
|
typedef struct _CIP_VALIDATE_INFO {
|
||
|
|
||
|
//
|
||
|
// Connection Handle
|
||
|
//
|
||
|
HANDLE hConnect;
|
||
|
|
||
|
//
|
||
|
// Validate Context
|
||
|
//
|
||
|
PVOID Context;
|
||
|
|
||
|
//
|
||
|
// TimeStamp for current source packet
|
||
|
//
|
||
|
CYCLE_TIME TimeStamp;
|
||
|
|
||
|
//
|
||
|
// Packet offset for current source packet
|
||
|
//
|
||
|
PUCHAR Packet;
|
||
|
|
||
|
} CIP_VALIDATE_INFO, *PCIP_VALIDATE_INFO;
|
||
|
|
||
|
//
|
||
|
// NotifyInfo Struct. returned on pfnNotify
|
||
|
//
|
||
|
typedef struct _CIP_NOTIFY_INFO {
|
||
|
|
||
|
//
|
||
|
// Connection Handle
|
||
|
//
|
||
|
HANDLE hConnect;
|
||
|
|
||
|
//
|
||
|
// Notify Context
|
||
|
//
|
||
|
PVOID Context;
|
||
|
|
||
|
//
|
||
|
// Frame
|
||
|
//
|
||
|
PCIP_FRAME Frame;
|
||
|
|
||
|
} CIP_NOTIFY_INFO, *PCIP_NOTIFY_INFO;
|
||
|
|
||
|
//
|
||
|
// Validate & Notify Routines
|
||
|
//
|
||
|
typedef
|
||
|
ULONG
|
||
|
(*PCIP_VALIDATE_ROUTINE) (
|
||
|
IN PCIP_VALIDATE_INFO ValidateInfo
|
||
|
);
|
||
|
|
||
|
typedef
|
||
|
ULONG
|
||
|
(*PCIP_NOTIFY_ROUTINE) (
|
||
|
IN PCIP_NOTIFY_INFO NotifyInfo
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// CIP Frame Struct
|
||
|
//
|
||
|
struct _CIP_FRAME {
|
||
|
|
||
|
IN PCIP_FRAME pNext; // chain multiple frames together
|
||
|
|
||
|
IN ULONG Flags; //specify flag options
|
||
|
|
||
|
IN PCIP_VALIDATE_ROUTINE pfnValidate; //backdoor
|
||
|
|
||
|
IN PVOID ValidateContext;
|
||
|
|
||
|
IN PCIP_NOTIFY_ROUTINE pfnNotify; //completion
|
||
|
|
||
|
IN PVOID NotifyContext;
|
||
|
|
||
|
OUT CYCLE_TIME Timestamp;
|
||
|
|
||
|
OUT ULONG Status;
|
||
|
|
||
|
IN OUT PUCHAR Packet; //the locked buffer
|
||
|
|
||
|
OUT ULONG CompletedBytes;
|
||
|
};
|
||
|
|
||
|
//
|
||
|
// CIP Attach Frame Structure
|
||
|
//
|
||
|
typedef struct _CIP_ATTACH_FRAME {
|
||
|
|
||
|
HANDLE hConnect; // Connect Handle
|
||
|
|
||
|
ULONG FrameLength; // Frame Length
|
||
|
|
||
|
ULONG SourceLength; // Source Length
|
||
|
|
||
|
PCIP_FRAME Frame; // Frame
|
||
|
|
||
|
} CIP_ATTACH_FRAME, *PCIP_ATTACH_FRAME;
|
||
|
|
||
|
//
|
||
|
// CIP Cancel Frame Structure
|
||
|
//
|
||
|
typedef struct _CIP_CANCEL_FRAME {
|
||
|
|
||
|
IN HANDLE hConnect;
|
||
|
|
||
|
IN PCIP_FRAME Frame;
|
||
|
|
||
|
} CIP_CANCEL_FRAME, *PCIP_CANCEL_FRAME;
|
||
|
|
||
|
//
|
||
|
// CIP Talk Structure
|
||
|
//
|
||
|
typedef struct _CIP_TALK {
|
||
|
|
||
|
//
|
||
|
// Connect Handle
|
||
|
//
|
||
|
IN HANDLE hConnect;
|
||
|
|
||
|
} CIP_TALK, *PCIP_TALK;
|
||
|
|
||
|
//
|
||
|
// CIP Listen Structure
|
||
|
//
|
||
|
typedef struct _CIP_LISTEN {
|
||
|
|
||
|
//
|
||
|
// Connect Handle
|
||
|
//
|
||
|
IN HANDLE hConnect;
|
||
|
|
||
|
} CIP_LISTEN, *PCIP_LISTEN;
|
||
|
|
||
|
//
|
||
|
// CIP Stop Structure
|
||
|
//
|
||
|
typedef struct _CIP_STOP {
|
||
|
|
||
|
//
|
||
|
// Connect Handle
|
||
|
//
|
||
|
IN HANDLE hConnect;
|
||
|
|
||
|
} CIP_STOP, *PCIP_STOP;
|
||
|
|
||
|
//
|
||
|
// FCP Frame Format
|
||
|
//
|
||
|
typedef struct _FCP_FRAME {
|
||
|
UCHAR ctype:4;
|
||
|
UCHAR cts:4;
|
||
|
UCHAR payload[511];
|
||
|
} FCP_FRAME, *PFCP_FRAME;
|
||
|
|
||
|
// Legacy FCP structs
|
||
|
typedef struct _FCP_SEND_REQUEST FCP_REQUEST, *PFCP_REQUEST;
|
||
|
typedef struct _FCP_GET_RESPONSE FCP_RESPONSE, *PFCP_RESPONSE;
|
||
|
|
||
|
//
|
||
|
// FCP Send Request Structure
|
||
|
//
|
||
|
typedef struct _FCP_SEND_REQUEST {
|
||
|
IN NODE_ADDRESS NodeAddress;
|
||
|
IN ULONG Length;
|
||
|
IN PFCP_FRAME Frame;
|
||
|
} FCP_SEND_REQUEST, *PFCP_SEND_REQUEST;
|
||
|
|
||
|
//
|
||
|
// FCP Get Response Structure
|
||
|
//
|
||
|
typedef struct _FCP_GET_RESPONSE {
|
||
|
OUT NODE_ADDRESS NodeAddress;
|
||
|
IN OUT ULONG Length;
|
||
|
IN OUT PFCP_FRAME Frame;
|
||
|
} FCP_GET_RESPONSE, *PFCP_GET_RESPONSE;
|
||
|
|
||
|
//
|
||
|
// FCP Get Request Structure
|
||
|
//
|
||
|
typedef struct _FCP_GET_REQUEST {
|
||
|
OUT NODE_ADDRESS NodeAddress;
|
||
|
IN OUT ULONG Length;
|
||
|
IN OUT PFCP_FRAME Frame;
|
||
|
} FCP_GET_REQUEST, *PFCP_GET_REQUEST;
|
||
|
|
||
|
//
|
||
|
// FCP Send Response Structure
|
||
|
//
|
||
|
typedef struct _FCP_SEND_RESPONSE {
|
||
|
IN NODE_ADDRESS NodeAddress;
|
||
|
IN ULONG Length;
|
||
|
IN PFCP_FRAME Frame;
|
||
|
} FCP_SEND_RESPONSE, *PFCP_SEND_RESPONSE;
|
||
|
|
||
|
//
|
||
|
// Set FCP Notify Flags
|
||
|
//
|
||
|
#define DEREGISTER_FCP_NOTIFY 0x00000000
|
||
|
|
||
|
#define REGISTER_FCP_RESPONSE_NOTIFY 0x00000001
|
||
|
#define REGISTER_FCP_REQUEST_NOTIFY 0x00000002
|
||
|
|
||
|
//
|
||
|
// Set FCP Notify Structure
|
||
|
//
|
||
|
typedef struct _SET_FCP_NOTIFY {
|
||
|
|
||
|
//
|
||
|
// Flags
|
||
|
//
|
||
|
IN ULONG Flags;
|
||
|
|
||
|
//
|
||
|
// Node Address
|
||
|
//
|
||
|
IN NODE_ADDRESS NodeAddress;
|
||
|
|
||
|
} SET_FCP_NOTIFY, *PSET_FCP_NOTIFY;
|
||
|
|
||
|
//
|
||
|
// Plug Notify Routine
|
||
|
//
|
||
|
typedef struct _CMP_NOTIFY_INFO {
|
||
|
|
||
|
HANDLE hPlug;
|
||
|
|
||
|
AV_PCR Pcr;
|
||
|
|
||
|
PVOID Context;
|
||
|
|
||
|
} CMP_NOTIFY_INFO, *PCMP_NOTIFY_INFO;
|
||
|
|
||
|
//
|
||
|
// Plug Notify Routine
|
||
|
//
|
||
|
typedef
|
||
|
void
|
||
|
(*PCMP_NOTIFY_ROUTINE) (
|
||
|
IN PCMP_NOTIFY_INFO NotifyInfo
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// CreatePlug
|
||
|
//
|
||
|
typedef struct _CMP_CREATE_PLUG {
|
||
|
|
||
|
// Type of plug to create
|
||
|
IN CMP_PLUG_TYPE PlugType;
|
||
|
|
||
|
// PCR Settings
|
||
|
IN AV_PCR Pcr;
|
||
|
|
||
|
// Notification Routine for Register
|
||
|
IN PCMP_NOTIFY_ROUTINE pfnNotify;
|
||
|
|
||
|
// Notification Context
|
||
|
IN PVOID Context;
|
||
|
|
||
|
// Plug Number
|
||
|
OUT ULONG PlugNum;
|
||
|
|
||
|
// Plug Handle
|
||
|
OUT HANDLE hPlug;
|
||
|
|
||
|
} CMP_CREATE_PLUG, *PCMP_CREATE_PLUG;
|
||
|
|
||
|
//
|
||
|
// DeletePlug
|
||
|
//
|
||
|
typedef struct _CMP_DELETE_PLUG {
|
||
|
|
||
|
// Plug Handle
|
||
|
IN HANDLE hPlug;
|
||
|
|
||
|
} CMP_DELETE_PLUG, *PCMP_DELETE_PLUG;
|
||
|
|
||
|
//
|
||
|
// SetPlug
|
||
|
//
|
||
|
typedef struct _CMP_SET_PLUG {
|
||
|
|
||
|
// Plug Handle
|
||
|
IN HANDLE hPlug;
|
||
|
|
||
|
// PCR Settings
|
||
|
IN AV_PCR Pcr;
|
||
|
|
||
|
} CMP_SET_PLUG, *PCMP_SET_PLUG;
|
||
|
|
||
|
//
|
||
|
// Bus Reset Notify Routine
|
||
|
//
|
||
|
typedef
|
||
|
void
|
||
|
(*PBUS_RESET_ROUTINE) (
|
||
|
IN PVOID Context,
|
||
|
IN PBUS_GENERATION_NODE BusResetInfo
|
||
|
);
|
||
|
|
||
|
#define REGISTER_BUS_RESET_NOTIFY 0x1
|
||
|
#define DEREGISTER_BUS_RESET_NOTIFY 0x2
|
||
|
|
||
|
//
|
||
|
// BusResetNotify
|
||
|
//
|
||
|
typedef struct _BUS_RESET_NOTIFY {
|
||
|
|
||
|
IN ULONG Flags;
|
||
|
|
||
|
IN PBUS_RESET_ROUTINE pfnNotify;
|
||
|
|
||
|
IN PVOID Context;
|
||
|
|
||
|
} BUS_RESET_NOTIFY, *PBUS_RESET_NOTIFY;
|
||
|
|
||
|
//
|
||
|
// Flags for Av61883_SetUnitDirectory
|
||
|
//
|
||
|
#define ADD_UNIT_DIRECTORY_ENTRY 0x1
|
||
|
#define REMOVE_UNIT_DIRECTORY_ENTRY 0x2
|
||
|
#define ISSUE_BUS_RESET_AFTER_MODIFY 0x4
|
||
|
|
||
|
//
|
||
|
// Set Unit Directory
|
||
|
//
|
||
|
typedef struct _SET_UNIT_DIRECTORY {
|
||
|
|
||
|
IN ULONG Flags;
|
||
|
|
||
|
IN ULONG UnitSpecId;
|
||
|
|
||
|
IN ULONG UnitSwVersion;
|
||
|
|
||
|
IN OUT HANDLE hCromEntry;
|
||
|
|
||
|
} SET_UNIT_DIRECTORY, *PSET_UNIT_DIRECTORY;
|
||
|
|
||
|
//
|
||
|
// States for Monitoring Plugs
|
||
|
//
|
||
|
#define MONITOR_STATE_CREATED 0x00000001 // Plug Created
|
||
|
#define MONITOR_STATE_REMOVED 0x00000002 // Plug Removed
|
||
|
#define MONITOR_STATE_UPDATED 0x00000004 // Plug Contents Updated
|
||
|
|
||
|
//
|
||
|
// Monitor Plugs Notify Routine
|
||
|
//
|
||
|
typedef struct _CMP_MONITOR_INFO {
|
||
|
|
||
|
ULONG State;
|
||
|
|
||
|
ULONG PlugNum;
|
||
|
|
||
|
ULONG PlugType;
|
||
|
|
||
|
AV_PCR Pcr;
|
||
|
|
||
|
PVOID Context;
|
||
|
|
||
|
} CMP_MONITOR_INFO, *PCMP_MONITOR_INFO;
|
||
|
|
||
|
typedef
|
||
|
void
|
||
|
(*PCMP_MONITOR_ROUTINE) (
|
||
|
IN PCMP_MONITOR_INFO MonitorInfo
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Flags for Av61883_MonitorPlugs
|
||
|
//
|
||
|
#define REGISTER_MONITOR_PLUG_NOTIFY 0x1
|
||
|
#define DEREGISTER_MONITOR_PLUG_NOTIFY 0x2
|
||
|
|
||
|
//
|
||
|
// MonitorPlugs (Local only)
|
||
|
//
|
||
|
typedef struct _CMP_MONITOR_PLUGS {
|
||
|
|
||
|
IN ULONG Flags;
|
||
|
|
||
|
IN PCMP_MONITOR_ROUTINE pfnNotify;
|
||
|
|
||
|
IN PVOID Context;
|
||
|
|
||
|
} CMP_MONITOR_PLUGS, *PCMP_MONITOR_PLUGS;
|
||
|
|
||
|
//
|
||
|
// Av61883 Struct
|
||
|
//
|
||
|
typedef struct _AV_61883_REQUEST {
|
||
|
|
||
|
//
|
||
|
// Requested Function
|
||
|
//
|
||
|
ULONG Function;
|
||
|
|
||
|
//
|
||
|
// Selected DDI Version
|
||
|
//
|
||
|
ULONG Version;
|
||
|
|
||
|
//
|
||
|
// Flags
|
||
|
//
|
||
|
ULONG Flags;
|
||
|
|
||
|
union {
|
||
|
|
||
|
GET_UNIT_INFO GetUnitInfo;
|
||
|
SET_UNIT_INFO SetUnitInfo;
|
||
|
|
||
|
CMP_GET_PLUG_HANDLE GetPlugHandle;
|
||
|
CMP_GET_PLUG_STATE GetPlugState;
|
||
|
CMP_CONNECT Connect;
|
||
|
CMP_DISCONNECT Disconnect;
|
||
|
|
||
|
CIP_ATTACH_FRAME AttachFrame;
|
||
|
CIP_CANCEL_FRAME CancelFrame;
|
||
|
CIP_TALK Talk;
|
||
|
CIP_LISTEN Listen;
|
||
|
CIP_STOP Stop;
|
||
|
|
||
|
FCP_REQUEST Request; // Legacy
|
||
|
FCP_RESPONSE Response; // Legacy
|
||
|
|
||
|
FCP_SEND_REQUEST SendRequest;
|
||
|
FCP_GET_RESPONSE GetResponse;
|
||
|
|
||
|
FCP_GET_REQUEST GetRequest;
|
||
|
FCP_SEND_RESPONSE SendResponse;
|
||
|
|
||
|
SET_FCP_NOTIFY SetFcpNotify;
|
||
|
|
||
|
CMP_CREATE_PLUG CreatePlug;
|
||
|
CMP_DELETE_PLUG DeletePlug;
|
||
|
CMP_SET_PLUG SetPlug;
|
||
|
|
||
|
BUS_RESET_NOTIFY BusResetNotify;
|
||
|
|
||
|
SET_UNIT_DIRECTORY SetUnitDirectory;
|
||
|
|
||
|
CMP_MONITOR_PLUGS MonitorPlugs;
|
||
|
};
|
||
|
} AV_61883_REQUEST, *PAV_61883_REQUEST;
|
||
|
|
||
|
|