📄 tdiqhelp.c
字号:
/////////////////////////////////////////////////////////////////////////////
//// INCLUDE FILES
#include <windows.h>
#include <stdio.h>
#include <winsock.h>
#include <crtdbg.h>
#include <winioctl.h>
#include "tdiinfo.h" // from recent NT4DDK "\ddk\src\network\inc\tdiinfo.h"
#include "smpletcp.h" // from recent NT4DDK "\ddk\src\network\wshsmple\smpletcp.h"
// Copyright And Configuration Management ----------------------------------
//
// TDI Query (TDIQ) Test Tool
// For
// Windows 95 And Windows NT
//
// TDI Query Help Library - TDIQHelp.c
//
// Copyright (c) 2000, Printing Communications Associates, Inc.
//
// Thomas F. Divine
// 4201 Brunswick Court
// Smyrna, Georgia 30080 USA
// (770) 432-4580
// tdivine@pcausa.com
//
// End ---------------------------------------------------------------------
static BOOLEAN g_bIsWindows9X = FALSE;
static ULONG g_nIPRouteEntrySize = sizeof( IPRouteEntry );
static HMODULE g_hModule = NULL;
//
// TCP/IP Action Codes (Windows 9X)
//
#define WSCNTL_TCPIP_QUERY_INFO 0x00000000
#define WSCNTL_TCPIP_SET_INFO 0x00000001
#define WSCNTL_TCPIP_ICMP_ECHO 0x00000002
#define WSCNTL_TCPIP_TEST 0x00000003
typedef int (__stdcall *WsControlProc)(DWORD, DWORD, LPVOID, LPDWORD, LPVOID, LPDWORD);
int __stdcall WsControlNT(
DWORD protocol,
DWORD action,
LPVOID pRequestInfo,
LPDWORD pcbRequestInfoLen,
LPVOID pResponseInfo,
LPDWORD pcbResponseInfoLen
)
{
HANDLE hDevice = INVALID_HANDLE_VALUE;
BOOL fResult;
DWORD nLastError;
int nResult = ERROR_SUCCESS;
if( protocol == IPPROTO_TCP )
{
//
// Create DOS Device Symbolic Link
//
fResult = DefineDosDevice(
DDD_RAW_TARGET_PATH,
"TCP",
"\\Device\\TCP"
);
if( !fResult )
{
printf( "DefineDosDevice failed\n" );
nResult = ERROR_BAD_DEVICE;
WSASetLastError( nResult );
goto RemoveDosDevice;
}
//
// Open TCP Device Handle
//
hDevice = CreateFile(
"\\\\.\\TCP",
0, // Device Query Access
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if( hDevice == INVALID_HANDLE_VALUE )
{
printf( "CreateFile failed\n" );
nResult = WSAGetLastError();
WSASetLastError( nResult );
goto RemoveDosDevice;
}
}
else if( protocol == IPPROTO_UDP )
{
//
// Create DOS Device Symbolic Link
//
fResult = DefineDosDevice(
DDD_RAW_TARGET_PATH,
"UDP",
"\\Device\\UDP"
);
if( !fResult )
{
printf( "DefineDosDevice failed\n" );
nResult = ERROR_BAD_DEVICE;
WSASetLastError( nResult );
goto RemoveDosDevice;
}
//
// Open UDP Device Handle
//
hDevice = CreateFile(
"\\\\.\\UDP",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if( hDevice == INVALID_HANDLE_VALUE )
{
printf( "CreateFile failed\n" );
nResult = WSAGetLastError();
WSASetLastError( nResult );
goto RemoveDosDevice;
}
}
else
{
printf( "Invalid Protocol\n" );
nResult = WSAEPROTONOSUPPORT;
WSASetLastError( nResult );
goto RemoveDosDevice;
}
fResult = DeviceIoControl(
hDevice,
IOCTL_TCP_QUERY_INFORMATION_EX,
pRequestInfo,
*pcbRequestInfoLen,
pResponseInfo,
*pcbResponseInfoLen,
pcbResponseInfoLen,
NULL // Overlapped
);
if( !fResult )
{
nLastError = WSAGetLastError();
return( nLastError );
}
CloseHandle( hDevice );
RemoveDosDevice:
if( protocol == IPPROTO_TCP )
{
DefineDosDevice(
DDD_RAW_TARGET_PATH|DDD_REMOVE_DEFINITION|DDD_EXACT_MATCH_ON_REMOVE,
"TCP",
"\\Device\\TCP"
);
}
else if( protocol == IPPROTO_UDP )
{
DefineDosDevice(
DDD_RAW_TARGET_PATH|DDD_REMOVE_DEFINITION|DDD_EXACT_MATCH_ON_REMOVE,
"UDP",
"\\Device\\UDP"
);
}
return( nResult );
}
WsControlProc WsControl = NULL;
int
TDIQ_GetAtTable(
PUCHAR pQueryBuffer,
PULONG pQueryBufferSize
)
{
int result = ERROR_SUCCESS;
TCP_REQUEST_QUERY_INFORMATION_EX tcpRequestQueryInfoEx;
ULONG tcpRequestBufSize = sizeof( TCP_REQUEST_QUERY_INFORMATION_EX );
memset(&tcpRequestQueryInfoEx, 0, sizeof(tcpRequestQueryInfoEx));
tcpRequestQueryInfoEx.ID.toi_entity.tei_entity = AT_ENTITY;
tcpRequestQueryInfoEx.ID.toi_entity.tei_instance = 0;
tcpRequestQueryInfoEx.ID.toi_class = INFO_CLASS_PROTOCOL;
tcpRequestQueryInfoEx.ID.toi_type = INFO_TYPE_PROVIDER;
tcpRequestQueryInfoEx.ID.toi_id = AT_MIB_ADDRXLAT_ENTRY_ID;
result = WsControl(
IPPROTO_TCP,
WSCNTL_TCPIP_QUERY_INFO,
&tcpRequestQueryInfoEx,
&tcpRequestBufSize,
pQueryBuffer,
pQueryBufferSize
);
if( result )
{
fprintf(stderr, "%s(%d) TdiQueryDeviceControl failed (%ld)\n",
__FILE__,
__LINE__,
result
);
return( result );
}
return( result );
}
/////////////////////////////////////////////////////////////////////////////
//// TDIQ_GetIPInterfaceInfoForAddr
//
// Purpose
// Fetch the IPInterface information corresponding to the specified IP
// address.
//
// Parameters
//
// Return Value
//
// Remarks
// You should expect this function to fail in certain situations. For example,
// a PPP adapter that is not connected will not have a IPInterface entry.
//
int
TDIQ_GetIPInterfaceInfoForAddr(
IPAddr theIPAddr,
PUCHAR pQueryBuffer,
PULONG pQueryBufferSize // IPInterfaceInfo size + MAX_PHYSADDR_SIZE for address bytes
)
{
int result = ERROR_SUCCESS;
TCP_REQUEST_QUERY_INFORMATION_EX tcpRequestQueryInfoEx;
ULONG tcpRequestBufSize = sizeof( TCP_REQUEST_QUERY_INFORMATION_EX );
memset(&tcpRequestQueryInfoEx, 0, sizeof(tcpRequestQueryInfoEx));
tcpRequestQueryInfoEx.ID.toi_entity.tei_entity = CL_NL_ENTITY;
tcpRequestQueryInfoEx.ID.toi_entity.tei_instance = 0;
tcpRequestQueryInfoEx.ID.toi_class = INFO_CLASS_PROTOCOL;
tcpRequestQueryInfoEx.ID.toi_type = INFO_TYPE_PROVIDER;
tcpRequestQueryInfoEx.ID.toi_id = IP_INTFC_INFO_ID;
memcpy(
&tcpRequestQueryInfoEx.Context,
&theIPAddr,
sizeof( ULONG )
);
result = WsControl(
IPPROTO_TCP,
WSCNTL_TCPIP_QUERY_INFO,
&tcpRequestQueryInfoEx,
&tcpRequestBufSize,
pQueryBuffer,
pQueryBufferSize
);
if( result )
{
#ifdef ZNEVER
// This is an ordinary occurance for Win98 PPP
fprintf(stderr, "%s(%d) TdiQueryDeviceControl failed (%ld)\n",
__FILE__,
__LINE__,
result
);
#endif
return( result );
}
return( result );
}
int
TDIQ_GetIFEntryForInstance(
ULONG nInstance,
PUCHAR pQueryBuffer,
PULONG pQueryBufferSize // IFEntry size byte plus MAX_IFDESCR_LEN for description
)
{
int result = ERROR_SUCCESS;
TCP_REQUEST_QUERY_INFORMATION_EX tcpRequestQueryInfoEx;
ULONG tcpRequestBufSize = sizeof( TCP_REQUEST_QUERY_INFORMATION_EX );
memset(&tcpRequestQueryInfoEx, 0, sizeof(tcpRequestQueryInfoEx));
tcpRequestQueryInfoEx.ID.toi_entity.tei_entity = IF_ENTITY;
tcpRequestQueryInfoEx.ID.toi_entity.tei_instance = nInstance;
tcpRequestQueryInfoEx.ID.toi_class = INFO_CLASS_PROTOCOL;
tcpRequestQueryInfoEx.ID.toi_type = INFO_TYPE_PROVIDER;
tcpRequestQueryInfoEx.ID.toi_id = IF_MIB_STATS_ID;
result = WsControl(
IPPROTO_TCP,
WSCNTL_TCPIP_QUERY_INFO,
&tcpRequestQueryInfoEx,
&tcpRequestBufSize,
pQueryBuffer,
pQueryBufferSize
);
if( result )
{
fprintf(stderr, "%s(%d) TdiQueryDeviceControl failed (%ld)\n",
__FILE__,
__LINE__,
result
);
return( result );
}
return( result );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -