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

📄 tdiqhelp.c

📁 网络驱动开发
💻 C
📖 第 1 页 / 共 2 页
字号:
/////////////////////////////////////////////////////////////////////////////
//// 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 + -