/*++

Copyright (c) 1997-1999  Hewlett-Packard Company & Microsoft Corporation

Module Name:

    i2osmi.h

Abstract:

    This module defines the NT types, constants, and functions that are
    exposed from the i2oexec driver.

Revision History:

--*/

#if !defined(I2OSMI_HDR)
#define I2OSMI_HDR

#if _MSC_VER > 1000
#pragma once
#endif

#include <devioctl.h>

#include "I2OUtil.h"
#include "I2OExec.h"

#pragma pack (push, 1)

//
// Parameter structure for Get/Set Parameters call.
//

typedef struct _I2O_PARAM_BLOCK {
    ULONG           IOP;
    USHORT          TargetTID;
    UCHAR           ParamData[1];
} I2O_PARAM_BLOCK, *PI2O_PARAM_BLOCK;

//
// I2O IOP Descriptor
//

typedef struct  _I2O_IOP_DESCRIPTOR {
    U32          IOPNumber;
    BOOLEAN      (*SendHandler) (PVOID HandlerContext, PVOID     MessageFrame);
    PVOID        reserved;
    PVOID        reserved1;
    PVOID        HandlerContext;
    ULONG        (*GetMFA)(PVOID HandlerContext, PVOID MFA, PVOID Buffer, ULONG Size);
    ULONG        MaxMessageFrameSize;
    ULONG        ExpectedLCTSize;
    PVOID        AdapterObject;
    ULONG        MaxInboundMFrames;
    ULONG        InitialInboundMFrames;
} I2O_IOP_DESCRIPTOR, *PI2O_IOP_DESCRIPTOR;

//
// I2O IOP and LCT Configuration data
//

typedef struct _I2O_DEVICE_DESCRIPTOR {
    I2O_IOP_DESCRIPTOR      IOP;
    ULONG                   ChangeIndicator;
    I2O_LCT_ENTRY           LCT;
} I2O_DEVICE_DESCRIPTOR, *PI2O_DEVICE_DESCRIPTOR;

//
//      I2O Query Configuration Record structure
//

#define I2O_CLASS_MATCH_ANY_BITS  (((1<<I2O_CLASS_ID_SZ)-1) & I2O_CLASS_MATCH_ANYCLASS)

typedef struct _I2O_CONFIG_QUERY {
    ULONG          IOPNumber;
    I2O_CLASS_ID   ClassID;
    ULONG          SubClassID;
    ULONG          Index;
} I2O_CONFIG_QUERY, *PI2O_CONFIG_QUERY;

//
// Useful define in get/set operations
//

typedef struct _I2O_PARAM_SCALAR_OPERATION {
    I2O_PARAM_OPERATIONS_LIST_HEADER      OpList;
    I2O_PARAM_OPERATION_SPECIFIC_TEMPLATE OpBlock;
} I2O_PARAM_SCALAR_OPERATION, *PI2O_PARAM_SCALAR_OPERATION;
//
// Defines for the interface to the I2OExec driver.
//

#define I2O_GET_CONFIG_INFO        0xBA0
#define I2O_PRIVATE_MESSAGE_CODE   0xBB0
#define I2O_EXEC_REQUEST           0xBC0
#define I2O_PARAMS_GET_REQUEST     0xBD0
#define I2O_PARAMS_SET_REQUEST     0xBE0
#define I2O_GET_LCT                0xBF0
#define I2O_GET_IOPCOUNT           0xC00
#define I2O_GET_CONFIGDIALOG       0xC10

#define IOCTL_GET_CONFIG_INFO \
    CTL_CODE (FILE_DEVICE_UNKNOWN, I2O_GET_CONFIG_INFO, METHOD_BUFFERED, FILE_ANY_ACCESS)

#define IOCTL_PRIVATE_MESSAGE \
    CTL_CODE (FILE_DEVICE_UNKNOWN, I2O_PRIVATE_MESSAGE_CODE, METHOD_BUFFERED, FILE_ANY_ACCESS)

#define IOCTL_EXEC_REQUEST \
    CTL_CODE (FILE_DEVICE_UNKNOWN, I2O_EXEC_REQUEST, METHOD_BUFFERED, FILE_ANY_ACCESS)

#define IOCTL_PARAMS_GET_REQUEST \
    CTL_CODE (FILE_DEVICE_UNKNOWN, I2O_PARAMS_GET_REQUEST, METHOD_BUFFERED, FILE_ANY_ACCESS)

#define IOCTL_PARAMS_SET_REQUEST \
    CTL_CODE (FILE_DEVICE_UNKNOWN, I2O_PARAMS_SET_REQUEST, METHOD_BUFFERED, FILE_ANY_ACCESS)

#define IOCTL_GET_LCT \
    CTL_CODE (FILE_DEVICE_UNKNOWN, I2O_GET_LCT, METHOD_BUFFERED, FILE_ANY_ACCESS)

#define IOCTL_PRIVATE_MSG \
    CTL_CODE (FILE_DEVICE_UNKNOWN, I2O_PRIVATE_MESSAGE, METHOD_BUFFERED, FILE_ANY_ACCESS)

#define IOCTL_GET_IOP_COUNT \
    CTL_CODE (FILE_DEVICE_UNKNOWN, I2O_GET_IOPCOUNT, METHOD_BUFFERED, FILE_ANY_ACCESS)

#define IOCTL_GET_CONFIG_DIALOG \
    CTL_CODE (FILE_DEVICE_UNKNOWN, I2O_GET_CONFIGDIALOG, METHOD_BUFFERED, FILE_ANY_ACCESS)

#pragma pack (pop)

#endif          // I2OCONFIG_HDR