📄 ksutil.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 + -