⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ksutil.h

📁 网络驱动开发
💻 H
字号:
/////////////////////////////////////////////////////////////////////////////
//// INCLUDE FILES

#include "INetInc.h"
#include "KSTcpEx.h"

#ifndef __KSUTIL_H__
#define __KSUTIL_H__

// Copyright And Configuration Management ----------------------------------
//
//             Header For TDI Test TCP (TTCP) Utilities - KSUTIL.h
//
//                  PCAUSA TDI Client Samples For Windows NT
//
//      Copyright (c) 1999-2000 Printing Communications Associates, Inc.
//                                - PCAUSA -
//
//                             Thomas F. Divine
//                           4201 Brunswick Court
//                        Smyrna, Georgia 30080 USA
//                              (770) 432-4580
//                            tdivine@pcausa.com
//
// End ---------------------------------------------------------------------

/////////////////////////////////////////////////////////////////////////////
//// DEFINITIONS

// This constant is used for places where NdisAllocateMemory
// needs to be called and the HighestAcceptableAddress does
// not matter.
//
extern NDIS_PHYSICAL_ADDRESS HighestAcceptableMax;

//
// TDI Transport Device Names
// --------------------------
// These are some of the TDI device names. They are used with ZwCreateFile
// to open address, connection and control channel objects.
//

//
// TCP/IP TDI Transport Device Names
//
#define TCP_DEVICE_NAME_W              L"\\Device\\Tcp"
#define UDP_DEVICE_NAME_W              L"\\Device\\Udp"
#define RAWIP_DEVICE_NAME_W            L"\\Device\\RawIp"   // Base Name

//
// AppleTalk TDI Transport Device Names
//
#define ATALK_DDP_DEVICE_NAME_W          L"\\Device\\AtalkDdp"
#define ATALK_ADSP_DEVICE_NAME_W         L"\\Device\\AtalkAdsp"
#define ATALK_ASP_SERVER_DEVICE_NAME_W   L"\\Device\\AtalkAspServer"
#define ATALK_ASP_CLIENT_DEVICE_NAME_W   L"\\Device\\AtalkAspClient"
#define ATALK_PAP_DEVICE_NAME_W          L"\\Device\\AtalkPap"

//
// Definitions for TCP states.
//
#define TCB_CLOSED     0   // Closed.
#define TCB_LISTEN     1   // Listening.
#define TCB_SYN_SENT   2   // SYN Sent.
#define TCB_SYN_RCVD   3   // SYN received.
#define TCB_ESTAB      4   // Established.
#define TCB_FIN_WAIT1  5   // FIN-WAIT-1
#define TCB_FIN_WAIT2  6   // FIN-WAIT-2
#define TCB_CLOSE_WAIT 7   // Close waiting.
#define TCB_CLOSING    8   // Closing state.
#define TCB_LAST_ACK   9   // Last ack state.
#define TCB_TIME_WAIT  10  // Time wait state.

//
// SPX/IPX TDI Transport Device Names
//

//
// NetBEUI TDI Transport Device Names
// ----------------------------------
// These are not predefined. Nbf.sys exports a device name for each bound
// adapter. The name consists of a "\Device\Nbf_" prefix followed by the
// adapter base name.
//
#define NBF_DEVICE_NAME_PREFIX         L"\\Device\\Nbf_" // Append Adapter Name
//#define NBF_TYPICAL_DEVICE_NAME_1      L"\\Device\\Nbf_DC21X41"
//#define NBF_TYPICAL_DEVICE_NAME_2      L"\\Device\\Nbf_PCASIMMP2"


/////////////////////////////////////////////////////////////////////////////
//// STRUCTURES

typedef
VOID
(*PKS_REQUEST_COMPLETION_ROUTINE) (
    PVOID UserCompletionContext,
    PIO_STATUS_BLOCK IoStatusBlock,
    ULONG Reserved
    );

//
// Be sure to zero the KS_ADDRESS structure before initializing selected
// fields.
//
typedef
struct _KS_ADDRESS
{
   NTSTATUS       m_nStatus;        // Status Of KS_OpenTransportAddress Call

   LONG           m_ReferenceCount; // Number Of References To This Object

   HANDLE         m_hAddress;       // Handle to the address object
   PFILE_OBJECT   m_pFileObject;    // The Transport Address File Object

   PIRP           m_pAtomicIrp;

   LIST_ENTRY     m_ConnectionList;
}
   KS_ADDRESS, *PKS_ADDRESS;


typedef
struct _KS_ENDPOINT
{
   LIST_ENTRY     m_ListElement;       // For Linking To m_ConnectionList

   NTSTATUS       m_nAssociateStatus;  // Status Of KS_AssociateAddress Call

   LONG           m_ReferenceCount;    // Number Of References To This Object

   //
   // TDI Address Object Information
   //
   PKS_ADDRESS    m_pKS_Address;       // Pointer To Address Information

   //
   // TDI Connection Context Information
   //
   NTSTATUS       m_nOpenStatus;    // Status Of KS_OpenConnectionContext Call

   HANDLE         m_hContext;       // Handle to the connection context object
   PFILE_OBJECT   m_pFileObject;    // The Connection Endpoint File Object
}
   KS_ENDPOINT, *PKS_ENDPOINT;


typedef
struct _KS_CHANNEL
{
   HANDLE         m_hControlChannel; // Handle to the Control Channel object
   PFILE_OBJECT   m_pFileObject;    // The Control Channel File Object
}
   KS_CHANNEL, *PKS_CHANNEL;

/////////////////////////////////////////////////////////////////////////////
//// FUNCTION PROTOTYPES

#ifdef __cplusplus
extern "C" {
#endif

/////////////////////////////////////////////////////////////////////////////
//                    A D D R E S S  F U N C T I O N S                     //
/////////////////////////////////////////////////////////////////////////////

NTSTATUS
KS_OpenTransportAddress(
   IN PWSTR                TransportDeviceNameW,// Zero-terminated String
   IN PTRANSPORT_ADDRESS   pTransportAddress,   // Local Transport Address
   PKS_ADDRESS             pKS_Address
   );

NTSTATUS
KS_CloseTransportAddress(
   PKS_ADDRESS             pKS_Address
   );

NTSTATUS
KS_SetEventHandlers(
   PKS_ADDRESS             pKS_Address,
   PVOID                   pEventContext,
   PTDI_IND_CONNECT        ConnectEventHandler,
   PTDI_IND_DISCONNECT     DisconnectEventHandler,
   PTDI_IND_ERROR          ErrorEventHandler,
   PTDI_IND_RECEIVE        ReceiveEventHandler,
   PTDI_IND_RECEIVE_DATAGRAM  ReceiveDatagramEventHandler,
   PTDI_IND_RECEIVE_EXPEDITED ReceiveExpeditedEventHandler
   );

NTSTATUS
KS_SendDatagramOnAddress(
   PKS_ADDRESS                   pKS_Address,
   HANDLE                        UserCompletionEvent,    // Optional
   PKS_REQUEST_COMPLETION_ROUTINE   UserCompletionRoutine,  // Optional
   PVOID                         UserCompletionContext,  // Optional
   PIO_STATUS_BLOCK              pIoStatusBlock,         // Required
   PMDL                          pSendMdl,
   PTDI_CONNECTION_INFORMATION   pSendDatagramInfo
   );

NTSTATUS
KS_ReceiveDatagramOnAddress(
   PKS_ADDRESS                   pKS_Address,
   HANDLE                        UserCompletionEvent,    // Optional
   PKS_REQUEST_COMPLETION_ROUTINE   UserCompletionRoutine,  // Optional
   PVOID                         UserCompletionContext,  // Optional
   PIO_STATUS_BLOCK              pIoStatusBlock,         // Required
   PMDL                          pReceiveMdl,
   PTDI_CONNECTION_INFORMATION   pReceiveDatagramInfo,
   PTDI_CONNECTION_INFORMATION   pReturnInfo,
   ULONG                         InFlags
   );

NTSTATUS
KS_QueryAddressInfo(
   PFILE_OBJECT      pFileObject,
   PVOID             pInfoBuffer,
   PULONG            pInfoBufferSize
   );

/////////////////////////////////////////////////////////////////////////////
//                      E N D P O I N T  F U N C T I O N S                 //
/////////////////////////////////////////////////////////////////////////////

NTSTATUS
KS_OpenConnectionEndpoint(
   PWSTR             TransportDeviceNameW,// Zero-terminated String
   PKS_ADDRESS       pKS_Address,
   PKS_ENDPOINT      pKS_Endpoint,
   PVOID             pContext
   );

NTSTATUS
KS_CloseConnectionEndpoint(
   PKS_ENDPOINT   pKS_Endpoint
   );

NTSTATUS
KS_Connect(
   PKS_ENDPOINT          pKS_Endpoint,
   IN PTRANSPORT_ADDRESS   pTransportAddress // Remote Transport Address
   );

NTSTATUS
KS_Disconnect(
   PKS_ENDPOINT                   pKS_Endpoint,
   HANDLE                           UserCompletionEvent,    // Optional
   PKS_REQUEST_COMPLETION_ROUTINE   UserCompletionRoutine,  // Optional
   PVOID                            UserCompletionContext,  // Optional
   PIO_STATUS_BLOCK                 pIoStatusBlock,         // Required
   ULONG                            Flags
   );

NTSTATUS
KS_SendOnEndpoint(
   PKS_ENDPOINT                pKS_Endpoint,
   HANDLE                        UserCompletionEvent,    // Optional
   PKS_REQUEST_COMPLETION_ROUTINE   UserCompletionRoutine,  // Optional
   PVOID                         UserCompletionContext,  // Optional
   PIO_STATUS_BLOCK              pIoStatusBlock,          // Required
   PMDL                          pSendMdl,
   ULONG                         SendFlags
   );

NTSTATUS
KS_ReceiveOnEndpoint(
   PKS_ENDPOINT                pKS_Endpoint,
   HANDLE                        UserCompletionEvent,    // Optional
   PKS_REQUEST_COMPLETION_ROUTINE   UserCompletionRoutine,  // Optional
   PVOID                         UserCompletionContext,  // Optional
   PIO_STATUS_BLOCK              pIoStatusBlock,          // Required
   PMDL                          pReceiveMdl,
   ULONG                         ReceiveFlags
   );

NTSTATUS
KS_QueryConnectionInfo(
   PKS_ENDPOINT      pKS_Endpoint,
   PVOID             pInfoBuffer,
   PULONG            pInfoBufferSize
   );

NTSTATUS
KS_SetConnectionInfo(
   PKS_ENDPOINT       pKS_Endpoint,
   PTDI_CONNECTION_INFO pConnectionInfo
   );

/////////////////////////////////////////////////////////////////////////////
//                T C P  E X T E N S I O N  F U N C T I O N S              //
/////////////////////////////////////////////////////////////////////////////

NTSTATUS
KS_TCPSetInformation(
   PFILE_OBJECT   pFileObject,
   ULONG          Entity,
   ULONG          Class,
   ULONG          Type,
   ULONG          Id,
   PVOID          pValue,
   ULONG          ValueLength
   );

NTSTATUS
KS_TCPQueryInformation(
   PFILE_OBJECT   pFileObject,
   ULONG          Entity,
   ULONG          Instance,
   ULONG          Class,
   ULONG          Type,
   ULONG          Id,
   PVOID          pOutputBuffer,
   PULONG         pdOutputLength
   );

NTSTATUS
KS_TCPGetIPSNMPInfo(
   PFILE_OBJECT   pFileObject,
   IPSNMPInfo     *pIPSnmpInfo,
   PULONG         pBufferSize
   );

NTSTATUS
KS_TCPGetIPAddrTable(
   PFILE_OBJECT   pFileObject,
   IPAddrEntry    *pIPAddrTable,
   PULONG         pBufferSize
   );

NTSTATUS
KS_TCPGetIPRouteTable(
   PFILE_OBJECT   pFileObject,
   IPRouteEntry   *pIPRouteEntry,
   PULONG         pBufferSize
   );

NTSTATUS
KS_TCPGetIPInterfaceInfoForAddr(
   PFILE_OBJECT      pFileObject,
   IPAddr            theIPAddr,
   PUCHAR            pQueryBuffer,// IPInterfaceInfo size + MAX_PHYSADDR_SIZE for address bytes
   PULONG            pBufferSize
   );

/////////////////////////////////////////////////////////////////////////////
//                     U T I L I T Y  F U N C T I O N S                    //
/////////////////////////////////////////////////////////////////////////////

PMDL
KS_AllocateAndProbeMdl(
   PVOID VirtualAddress,
   ULONG Length,
   BOOLEAN SecondaryBuffer,
   BOOLEAN ChargeQuota,
   PIRP Irp OPTIONAL
   );

VOID
KS_UnlockAndFreeMdl(
   PMDL pMdl
   );

NTSTATUS
KS_MakeSimpleTdiRequest(
   IN PDEVICE_OBJECT pDeviceObject,
   IN PIRP pIrp
   );

NTSTATUS
KS_BuildEaBuffer(
    IN  ULONG                     EaNameLength,
    IN  PVOID                     pEaName,
    IN  ULONG                     EaValueLength,
    IN  PVOID                     pEaValue,
    OUT PFILE_FULL_EA_INFORMATION *pEaBufferPointer,
    OUT PULONG                    pEaBufferLength
    );

ULONG
KS_TransportAddressLength(
   PTRANSPORT_ADDRESS pTransportAddress
   );

VOID KS_InitIPAddress(
   PTA_IP_ADDRESS pTransportAddress,
   ULONG          IPAddress,  // As 4-byte ULONG, Network Byte Order
   USHORT         IPPort      // Network Byte Order
   );

/////////////////////////////////////////////////////////////////////////////
//           C O N T R O L  C H A N N E L  F U N C T I O N S               //
/////////////////////////////////////////////////////////////////////////////

NTSTATUS
KS_OpenControlChannel(
   IN PWSTR       TransportDeviceNameW,// Zero-terminated String
   PKS_CHANNEL    pKS_Channel
   );

NTSTATUS
KS_CloseControlChannel(
   PKS_CHANNEL    pKS_Channel
   );

NTSTATUS
KS_QueryProviderInfo(
   PWSTR                TransportDeviceNameW,// Zero-terminated String
   PTDI_PROVIDER_INFO   pProviderInfo
   );

NTSTATUS
KS_QueryProviderStatistics(
   PWSTR                    TransportDeviceNameW,// Zero-terminated String
   PTDI_PROVIDER_STATISTICS pProviderStatistics
   );

NTSTATUS
KS_CreateSymbolicLink(
   IN PUNICODE_STRING  DeviceName,      // "\\Device\\TDITTCP"
   IN BOOLEAN bCreate
   );

VOID KS_FreePacketAndBuffers(
   PNDIS_PACKET Packet
   );

USHORT   KS_htons( USHORT hostshort );
USHORT   KS_ntohs( USHORT netshort );
ULONG    KS_htonl( ULONG hostlong );
ULONG    KS_ntohl( ULONG netlong );
USHORT   KS_in_cksum( PUCHAR pStartingByte, int nByteCount );

//
// Maximum length of NT process name
//
#define NT_PROCNAMELEN  16

ULONG    KS_InitProcessNameOffset( VOID );
BOOLEAN  KS_GetCurrentProcessName( PCHAR ProcessName );


/////////////////////////////////////////////////////////////////////////////
//                        D E B U G  F U N C T I O N S                     //
/////////////////////////////////////////////////////////////////////////////

#ifdef DBG

NTSTATUS
DEBUG_DumpProviderInfo(
   PWSTR pDeviceName,
   PTDI_PROVIDER_INFO pProviderInfo
   );

NTSTATUS
DEBUG_DumpProviderStatistics(
   PWSTR pDeviceName,
   PTDI_PROVIDER_STATISTICS pProviderStatistics
   );

VOID
DEBUG_DumpTAAddress(
   USHORT nAddressType,			// e.g., TDI_ADDRESS_TYPE_IP
   PUCHAR pTAAddr
   );

VOID
DEBUG_DumpTransportAddress(
   PTRANSPORT_ADDRESS pTransAddr
   );

VOID
DEBUG_DumpConnectionInfo(
   PTDI_CONNECTION_INFO pConnectionInfo
   );

VOID
DEBUG_DumpAddressInfo(
   PTDI_ADDRESS_INFO pAddressInfo
   );

#else

#define DEBUG_DumpProviderInfo(n,i)
#define DEBUG_DumpProviderStatistics(n,i)
#define DEBUG_DumpTAAddress(n,p)
#define DEBUG_DumpTransportAddress(p)
#define DEBUG_DumpConnectionInfo(p)
#define DEBUG_DumpAddressInfo(p)

#endif DBG

#ifdef __cplusplus
}
#endif

#endif // __KSUTIL_H__

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -